1

ヘッダーのみのライブラリを作成していますが、コンパイル中に表示される警告を取得したいと考えています。ただし、ライブラリを含む「メイン」プロジェクトの警告のみが表示され、ライブラリ自体の警告は表示されないようです。

含まれているライブラリの警告をコンパイラに強制的にチェックさせる方法はありますか?

// main.cpp
#include "MyHeaderOnlyLib.hpp"
int main() { ... }

// Compile
g++ ./main.cpp -Wall -Wextra -pedantic ...

// Warnings get displayed for main.cpp, but not for MyHeaderOnlyLib.hpp

MyHeaderOnlyLib.hppを使用して、CMakeスクリプトを介して見つけていfind_packageます。CMake によって実行されるコマンドを確認したところ-I、 ではなくが使用されてい-isystemます。

ライブラリを<...>/usr/include/ディレクトリにある場合)またはローカルで"...".

4

1 に答える 1

2

テンプレート ライブラリがあり、そのコンパイルで警告が表示されないことに不満を持っていると思います。#include間違ったパスを探す必要はありません。エラーになる可能性があります。残念ながら、特殊化しないと (テンプレートが によって使用されない限り.cpp)、コンパイラはテンプレートを確実に解釈する方法がなく、ましてや賢明な警告を生成することはできません。このことを考慮:

#include <vector>

template <class C>
struct T {
    bool pub_x(const std::vector<int> &v, int i)
    {
        return v.size() < i;
    }

    bool pub_y(const std::vector<int> &v, int i)
    {
        return v.size() < i;
    }
};

typedef T<int> Tint; // will not help

bool pub_z(const std::vector<int> &v, unsigned int i) // if signed, produces warning
{
    return v.size() < i;
}

class WarningMachine {
    WarningMachine() // note that this is private
    {
        //T<int>().pub_y(std::vector<int>(), 10); // to produce warning for the template
    }
};

int main()
{
    //Tint().pub_y(std::vector<int>(), 10); // to produce warning for the template
    return 0;
}

codepadで試すことができます。pub_zは、呼び出されないにもかかわらず、コンパイル時に符号付き/符号なしの比較警告をすぐに生成することに注意してください。ただし、テンプレートについてはまったく別の話です。T::pub_yが呼び出されてもT::pub_x、警告なしに気付かれずに通過します。これはコンパイラの実装に依存します。一部のコンパイラは、すべての情報が利用可能になると、より積極的なチェックを実行しますが、他のコンパイラは遅延する傾向があります。T::pub_xどちらもT::pub_yテンプレート引数に依存しないことに注意してください。

確実に行う唯一の方法は、テンプレートを特化して関数を呼び出すことです。それを行うコードは、そのためにアクセス可能である必要がないことに注意してください ( のようにWarningMachine)。これは、最適化によって除外される候補になります (ただし、場合によって異なります)。また、関数に渡される値は、コードは決して実行されないため、有効な値です (これにより、配列の割り当てや、関数が必要とする可能性のあるデータの準備を省くことができます)。

一方で、実際にすべての関数をチェックするには多くのコードを書かなければならないので、有効なデータを渡して結果の正確性をチェックし、それを有用なものにすることもできます。あなたの後にコードを書いてください(上記の場合のように)。

于 2014-05-16T18:25:26.597 に答える