#ifdef macros vs -Wpedantic и "дополнительные" точки с запятой - PullRequest
0 голосов
/ 23 мая 2018

Моя кодовая библиотека имеет заголовочный файл, который содержит этот бит магии препроцессора:

#ifdef ENABLE_DEBUG_OBJECTS
# define DECLARE_DEBUG_OBJECT(v) DebugObject obj(v)
#else
# define DECLARE_DEBUG_OBJECT(v)
#endif

Идея состоит в том, что в различных классах в других заголовочных файлах я могу сделать это:

class MyClass
{
public:
   MyClass() {}

private:
   DECLARE_DEBUG_OBJECT(123);
};

... и если я определил -DENABLE_DEBUG_OBJECTS в моем файле Makefile, то MyClass будет содержать DebugObject в качестве закрытой переменной-члена, или, если я этого не сделал, не будет.

Это работает нормально, за исключением одного небольшого раздражения - если я скомпилирую свой код с флагом -Wpedantic clang, и без -DENABLE_DEBUG_OBJECTS, я получу много предупреждений о "лишней" точке с запятой вв разделе private::

$ clang++ -Wpedantic ./test.cpp
./test.cpp:14:29: warning: extra ';' inside a class [-Wextra-semi]
DECLARE_DEBUG_OBJECT(123);

Теперь два очевидных способа избежать этого - отключить предупреждение о лишних точках с запятой или поместить точку с запятой в строку #define вместо того, чтобы держать ее отдельно.в частном: раздел MyClass.

Однако я чувствую себя упрямым, и поэтому я предпочел бы разделить точку с запятой (только по эстетическим соображениям), и я также хотел бы бытьвозможность включить -Wpedantic, не видя, что эта ошибка появляется повсюду.

Итак, мой вопрос: есть ли какой-нибудь токен без операции, который я могу вставить в ветку non-ENABLE_DEBUG_OBJECTS, указанную выше #ifdef, которая убедила бы clang ++ не жаловаться на точку с запятой, но в противном случае была бы недоступна, есликомпилятор обеспокоен?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Альтернатива (работает на C ++ 98) будет static const int v = 0.Поскольку это целочисленное константное выражение, компиляторам обычно не требуется выделять для него хранилище / Это делает его по-настоящему не требующим накладных расходов.

0 голосов
/ 23 мая 2018

Тривиальное статическое утверждение (static_assert(true, "");) в настоящее время не используется для предупреждений Clang.Однако это может измениться в будущих версиях.

...