2

내가, 내가 static_assert들과 함께 테스트 할 수 있습니다 템플릿 코드를 많이 가지고 상상 그것을 컴파일? -fsyntax-only가 작동하지 않는 것 같습니다.단위 테스트 템플릿 코드

+0

글쎄, 나는 autotools와 같은 방법을 생각할 수있다. 특정 코드를 컴파일하고 컴파일러가 실제로 작동하는지 확인하십시오. –

+0

@ πάνταῥεῖ 나는 정확하게 그런 작은 스크립트를 가지고 있지만 어쨌든 그것은 나를 행복하게하지 못합니다. – Curious

+1

당신의 관심사는 정확히 무엇입니까? 현재 접근 방식을 보여 주시겠습니까? –

답변

1

같은 테스트를 작성하려고 할 것 :

clang -c -o /dev/null -xc++ - <header.h 

단계별 :

  • -c - 컴파일하지만

  • -o /dev/null 링크 - 모든 출력 파일

    을 생성하지 않는
  • -xc++ - 소스 유형이 될 것 C++

  • - - 표준 입력으로 주어진 소스

  • <header.h - 공급 헤더 파일을 입력으로

또한 프로젝트에 관련된 모든 것을 -D 또는 -I 플래그로 전달해야합니다.

echo '#include "header.h"' | clang -c -o /dev/null -xc++ -

:

  • 억제가 당신의 컴파일러가 간접적으로 -Wpragma-once-outside-header

  • 공급 헤더 echo과를 지원하는 경우 :

    #pragma once in main file, 당신도 할 수있는 경고를 해결하려면

    꼬리말 -을 잊지 마세요.

+0

'-o/dev/null'이 멋지게 보입니다. 나는 네가 친절하게 허용한다면 그것을 채택하고있다. ;-). –

+0

나는 대답을 upvoted하지만이 컴파일러는 이것이 주 파일이라고 생각하는 것 같습니다. 예를 들어, 템플릿 헤더 파일을 사용하면'g ++ '에서 얻은 결과는'경고 : #pragma once in main file [기본적으로 활성화 됨]'입니다. 이 주변의 어떤 방법? – Curious

+0

@Curious, 내 편집 참조 – deniss

2

의 당신이 gtest 같은 테스트 프레임 워크를 가정하지 않도록 글쎄, 나는 gccclang 모두 stdin 읽을 수있는 사실을 사용

TEST_F(MyTestClass,CheckSomeUtilCompiles) { 
    std::string codeInQuestion = R"(
    #include "MyTemplate.h" 
    int main() { 
     // instantiate SomeUtil with some invalid condition: 
     SomeUtil<int> x; 
    } 
    )"; 
    std::ofstream testFile("testcode.cpp"); 
    testfile << codeInQuestion; 
    testfile.close(); 

    EXPECT_EQ(?,system("$CPP -c $CPPFLAGS testcode.cpp -o /dev/null")); 
      //^Something other than zero 
} 
+0

나는 그것을 실제로 시도한 적이 없기 때문에 아마도 실제로 잘 작동 할 수 있지만, 다소 과민하고 과도하게 보인다. 컴파일 코드 스 니펫을 시도하는 쉘 스크립팅 언어에서 테스트 하니스를 선호합니다.당신은 그것을 위해 당신 만의 테스트 하네스를 작성해야하지만 아주 간단합니다. –

+0

@KonradRudolph _ "쉘 스크립팅 언어로 테스트 하네스를 사용하는 것을 선호합니다."_ 저는 정기적 인 단위 테스트에서 이러한 것들을 테스트하는 것을 선호합니다. –

+1

사실 너는 나를 납득시켰다. –