2

例えばユニットテストのテンプレートのコード

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

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

はちょうどこのヘッダを含むmain.cppを作ることによってこれをテストする唯一の方法ですので、私は、私はstatic_assert秒でテストすることができますテンプレートコードの多くを持っていることを想像しそれをコンパイルしますか? -fsyntax-onlyは動作していないようです。

+0

まあ、私はautotoolsのような方法を考えることができます。特定のコードをコンパイルして、実際のコンパイラが失敗したかどうかを確認してください。 –

+0

@πάνταῥεῖ私はちょうどそれを行うが、どういうわけか私を幸せにしていない小さなスクリプトを持っています。 – Curious

+1

あなたの懸念事項は何ですか?現在のアプローチを教えていただけますか? –

答えて

1

のようなテストを書くために試してみたstdinを読むことができます:

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

ステップバイステップ:

  • -c - コンパイルではなく

  • -o /dev/nullリンク - 任意の出力ファイル

    を生成しない
  • -xc++ - ソースタイプになりますC++

  • - - 標準入力として与えられたソース

  • <header.h - 供給をあなたのヘッダファイルを入力として

プロジェクトに関連するものもすべて-Dまたは-Iフラグに渡す必要があります。 #pragma once in main fileを警告する修正するには

、次のいずれかを実行します

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

を:あなたのコンパイラが echoと間接的に -Wpragma-once-outside-header

  • フィードヘッダーをサポートしている場合

    • は、それを抑制します

      末尾の-を忘れないでください。

  • +0

    '-o/dev/null'はうまく見えます。あなたが親切に許せば私はそれを採用しています;-)。 –

    +0

    答えをアップアップしましたが、コンパイラがこれがメインファイルだと思うようです。たとえば、テンプレートヘッダーファイルを使ってこれを行うと、 'g ++ 'から出力される出力は'警告:#pragma once in main file [デフォルトで有効] 'です。これはどうですか? – Curious

    +0

    @Curious、私の編集を参照してください – deniss

    2

    さて、あなたはGTESTのようなテストフレームワークを持っていると仮定しないように、私は実際gccclangの両方を使用して

    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

    実際にあなたは私に確信しています。 –

    関連する問題