Как использовать диагностическую прагму GCC с шаблонными функциями C ++? - PullRequest
5 голосов
/ 03 июня 2011

Я хотел бы использовать 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. Поразительно, что размещение #pragma GCC diagnostic ignored "-Wunused-parameter" перед основной функцией заставило компилятор замолчать, тогда как добавление #pragma GCC diagnostic error "-Wunused-parameter" в самом самом конце файла привело к тому, что компилятор снова выдал ошибку. Как решить эту головоломку?

(Обратите внимание, есть десятки тем об этой прагме, но я не смог никого найти что связано с такой настройкой)

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Проблема в том, что создание экземпляра шаблона компилируется при его использовании, а не когда он анализируется компилятором в заголовочном файле, поэтому он не выдаст предупреждение, пока не заменит T на int и не проанализирует его как обычный функция вне контекста прагма сайленсинга.

1 голос
/ 03 июня 2011

Обычный способ указать, что вы не собираетесь использовать параметр, это не давать ему имя:

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

int mystandardfunc(int /* i */) 
{ return 53; } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...