Временный макрос для хранения другого макроса и последующего возврата - PullRequest
1 голос
/ 02 июня 2011

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

#ifndef ENABLE_FULL_ERROR_ASSERTS
#define MY_ASSERT_COPY MY_ASSERT
#undef MY_ASSERT
#define MY_ASSERT
#endif

// Code for my current class, which happens to be header only

#ifndef ENABLE_FULL_ERROR_ASSERTS
#undef MY_ASSERT
#define MY_ASSERT MY_ASSERT_COPY
#undef MY_ASSERT_COPY
#endif

Теперь я знаю несколько способов обойти это, один из которых заключается в определении другого макроса для утверждений только для этого файла, который я затем могу отключить, не затрагивая утверждения в любой другой части программы. Сначала я думал, что это действительно элегантное решение (до того, как выяснил, что оно не компилируется), которое позволит мне использовать MY_ASSERT везде, а затем просто отключить его для определенных файлов.

Поскольку вышеприведенное не работает, есть ли обходной путь, который позволит мне выборочно уничтожать макрос, не затрагивая окружающий код и не определяя другой замещающий макрос, такой как #define MY_ASSERT_FOR_VECTORS MY_ASSERT

Ответы [ 2 ]

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

Некоторые компиляторы предоставляют #pragma push_macro и #pragma pop_macro для сохранения и восстановления состояния макроса.

Ограниченная переносимость.

0 голосов
/ 02 июня 2011

Это может работать не во всех ситуациях, но, возможно, вы можете просто undef макросы, определить их по своему желанию, а затем undef их снова.

В следующий раз, когда ваш код использует некоторые из этихмакросы должны #include заголовочные файлы, в которых они были изначально определены, поэтому они снова будут определять эти макросы.

Один из безопасных вариантов будет:

#ifndef ENABLE_FULL_ERROR_ASSERTS
#undef MY_ASSERT
#define MY_ASSERT ....
#endif

// Code for my current class, which happens to be header only

#ifndef ENABLE_FULL_ERROR_ASSERTS
#undef MY_ASSERT
#include "headers.h"  //etc
// line above should redefine the macros
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...