2

Stellen Sie sich vor, dass ich eine Menge von Template-Code, die ich mit static_assert s testen kann, so zum BeispielUnit-Tests Template-Code

template <typename Help> 
class SomeUtil { ... }; 

static_assert(std::is_same<SomeUtil<Type>::type, int>::value, "message"); 

ist der einzige Weg, dies zu testen, indem Sie ein main.cpp machen, die diesen Header enthält nur und kompilieren es? -fsyntax-only schien nicht zu funktionieren.

+0

Nun, ich könnte an Wege wie Autotools denken. Versuchen Sie, einen bestimmten Codeabschnitt zu kompilieren und festzustellen, ob der Compiler in der Aktion fehlschlägt. –

+0

@ πάνταῥεῖ Ich habe ein kleines Skript, das genau das tut, aber irgendwie macht mich das nicht glücklich. – Curious

+1

Was genau interessiert dich? Würde es Ihnen etwas ausmachen, uns Ihren derzeitigen Ansatz zu zeigen? –

Antwort

1

Mit der Tatsache, gcc und clang beide lesen können stdin schreiben:

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

Schritt für Schritt:

  • -c - kompilieren, aber nicht verknüpfen

  • -o /dev/null - erzeugen keine Ausgabedateien

  • -xc++ - Quelle Typ C++

  • - wäre - Quelle als stdin gegeben

  • <header.h - Versorgung Ihre Header-Datei als Eingabe

Beachten Sie, dass Sie auch alle für Ihr Projekt relevanten Flags -D oder -I übergeben müssen.

zu beheben über #pragma once in main file Warnung, können Sie entweder:

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

:

  • schalte es aus, wenn Ihr Compiler -Wpragma-once-outside-header

  • -Feed Kopf indirekt mit echo unterstützt

    Vergessen Sie nicht das nachfolgende -.

+0

'-o/dev/null' sieht gut aus. Ich habe das adoptiert, wenn du es freundlicherweise erlaubst ;-). –

+0

Ich habe Ihre Antwort hochgestuft, aber es scheint, als würde der Compiler denken, dass dies die Hauptdatei ist. Zum Beispiel, wenn ich das mit einer Template-Header-Datei mache, ist die Ausgabe, die ich von 'g ++' bekomme, 'warning: #pragma einmal in der Hauptdatei [standardmäßig aktiviert] '. Irgendwie in der Nähe? – Curious

+0

@Curious, siehe meine Bearbeitung – deniss

2

Nun, damit die Sie wie Gtest ein Test-Framework übernehmen, ich würde versuchen, einen Test wie

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

Ich habe es noch nie ausprobiert, vielleicht funktioniert das wirklich gut in der Praxis, aber es scheint ziemlich spröde und übertrieben. Ich hätte lieber eine Testumgebung in einer Shell-Skriptsprache, die versucht, Code-Snippets zu kompilieren.Du müsstest dafür dein eigenes Testkabel schreiben, aber es sollte (* es ist * ich habe es getan) sehr einfach sein. –

+0

@KonradRudolph _ "Ich hätte lieber eine Testumgebung in einer Shell-Skriptsprache" _ Nun, ich ziehe es vor, solche Dinge in meinen regulären Komponententests zu testen. –

+1

Eigentlich hast du mich überzeugt. –