Моя кодовая библиотека имеет заголовочный файл, который содержит этот бит магии препроцессора:
#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 ++ не жаловаться на точку с запятой, но в противном случае была бы недоступна, есликомпилятор обеспокоен?