Так что я пишу библиотеку, которая должна строить с -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 предупреждений?
Чтобы вызвать функцию при запуске, вы можете присвоить ей нестандартный '__attribute ((конструктор)) __'. – chris
@chris приятно знать - спасибо. но я предпочитаю решение, которое у меня уже есть, потому что мне также приходится иметь дело с компиляторами Windows и иметь тот же набор макросов для меня лучше – onqtam
Да, [выглядит сложным] (http://stackoverflow.com/a/2390626/962089) , Если это утешение, Clang теперь доступен в Visual Studio. – chris