2016-02-21 5 views
3

Так что я пишу библиотеку, которая должна строить с -pedantic -ansi -std=c++98 -Werror и -Weverything для лязга и -Wall -Wextra для НКИ и у меня есть этот макрос TESTSUITE(X), который предназначен для использования в глобальном масштабе, как это:Как требовать точки с запятой после макроса

TESTSUITE(current testsuite); 

и что она делает это вызов функции (при запуске программы инициализации фиктивного вара) со строкой:

#define TESTSUITE(name) \ 
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name) 

проблема заключается в том, что это порождает предупреждение под звоном для -Wglobal-constructors.

Если я окружить его _Pragma, как это:

#define TESTSUITE(name)            \ 
_Pragma("clang diagnostic push");         \ 
_Pragma("clang diagnostic ignored \"-Wglobal-constructors\"");  \ 
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name) \ 
_Pragma("clang diagnostic pop") 

точку с запятой после использования макроса не требуется для компиляции (и когда он отсутствует -pedantic выдает ошибку).

Если добавить это в конце макроса

static int ANONYMOUS_VARIABLE(SOME_PREFIX) = 5 

точку с запятой будет необходимо, но я получаю предупреждение за неиспользованную переменную, которую я не могу заставить замолчать (потому что, если я окружаю его _Pragma заявления я вернется к квадрату 1, не требующему точки с запятой).

У кого-нибудь есть идея, как я могу потребовать точку с запятой, а также иметь 0 предупреждений?

+1

Чтобы вызвать функцию при запуске, вы можете присвоить ей нестандартный '__attribute ((конструктор)) __'. – chris

+0

@chris приятно знать - спасибо. но я предпочитаю решение, которое у меня уже есть, потому что мне также приходится иметь дело с компиляторами Windows и иметь тот же набор макросов для меня лучше – onqtam

+0

Да, [выглядит сложным] (http://stackoverflow.com/a/2390626/962089) , Если это утешение, Clang теперь доступен в Visual Studio. – chris

ответ

2

Вы можете добавить объявление функции в конце макроса:

#define TESTSUITE(name) \ 
//...     \ 
void ANONYMOUS_FUNCTION() 

Demo

Имя функции не должны даже быть различными в разных TESTSUITE макросов. Достаточно, если он просто не используется нигде, так что он не участвует в перегрузке.

+0

спасибо, брат! спасательная игра – onqtam

+0

Похоже, что GCC может давать лучшие ошибки с '(void) 0' или, возможно,' (void). «TESTSUITE требует точку с запятой», если строковый литерал когда-либо отображается в ошибке. Ошибка Клана остается почти идентичной. – chris

+1

@chris '(void) 0;' - ошибка вне функции –

Смежные вопросы