5

g ++と-Werrorを使用したいので、制御できないサードパーティライブラリの警告を無効にする必要があります。http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.htmlによって提供されるソリューションは非常にうまく機能し、サードパーティのヘッダーのインクルードをプラグマでラップするだけで済みます。残念ながら、テンプレートが関係する特定のセットアップでは、それは機能しなくなりました。このアプローチが期待どおりに機能しなかった次の最小限の例を作成しました。

ソースファイルmain.cpp

#pragma GCC diagnostic ignored "-Wunused-parameter"
#include "hdr.hpp"
#pragma GCC diagnostic error "-Wunused-parameter"
int main() {
    return mytemplatefunc(2) + mystandardfunc(3); // will print ONLY ONE warning
}

およびヘッダーhdr.hpp

template<typename T>
int mytemplatefunc(T t) {
    return 42;
}
int mystandardfunc(int i) {
    return 53;
}

Makefileを使用してコンパイル

CPPFLAGS+=-Wunused-parameter -Werror
main: main.cpp

次のコンパイラエラーが発生します

g++  -Wunused-parameter -Werror   main.cpp   -o main
In file included from main.cpp:3:
hdr.hpp: In instantiation of ‘int mytemplatefunc(T) [with T = int]’:
main.cpp:29:   instantiated from here
hdr.hpp:2: error: unused parameter ‘t’
make: *** [main] Error 1
shell returned 2

ヘッダーをインクルードした直後のmain.cppでの明示的なインスタンス化は機能せず、main.cppでのテンプレート関数への呼び出しのラップも機能しなかったことに注意してください。main関数の前に置く#pragma GCC diagnostic ignored "-Wunused-parameter"とコンパイラーが沈黙し、ファイルの最後#pragma GCC diagnostic error "-Wunused-parameter"に追加するとコンパイラーが再びエラーを生成するという不可解なことがありました。このパズルを解く方法は?

(このプラグマについては数十のスレッドがありますが、そのようなセットアップに関係する人は見つかりませんでした)

4

2 に答える 2

5

問題は、テンプレートのインスタンス化は、ヘッダー ファイルでコンパイラによって解析されるときではなく、使用時にコンパイルされるため、T を int に置き換えて外部の通常の関数として解析するまで警告を発行しないことです。プラグマサイレンシングのコンテキスト。

于 2011-06-03T13:49:53.077 に答える
1

パラメータを使用するつもりがないことを示す通常の方法は、名前を付けないことです。

template<typename T> 
int mytemplatefunc(T /* t */) 
{ return 42; } 

int mystandardfunc(int /* i */) 
{ return 53; } 
于 2011-06-03T13:45:31.187 に答える