Как мне реализовать неиспользуемый макрос (или шаблон) в C ++? - PullRequest
24 голосов
/ 20 августа 2009

Как мне реализовать неоперативный макрос в C ++?

#include <iostream>   

#ifdef NOOP       
    #define conditional_noop(x) what goes here?   
#else       
    #define conditional_noop(x) std::cout << (x)   
#endif   
int main() {       
    conditional_noop(123);   
}

Я хочу, чтобы это ничего не делало, когда NOOP определен, и выведите «123», когда NOOP не определено.

Ответы [ 9 ]

51 голосов
/ 20 августа 2009

Если оставить это поле пустым, это очевидный вариант, я бы выбрал

#define conditional_noop(x) do {} while(0)

Этот трюк явно не работает, но заставляет вас писать точку с запятой после conditional_noop(123).

24 голосов
/ 20 августа 2009

Как упоминалось ранее - ничего.
Также в вашем коде есть опечатка.
это должно быть # иначе не # elif . если это # elif , за ним должно следовать новое условие

#include <iostream>   

#ifdef NOOP       
    #define conditional_noop(x) do {} while(0)
#else       
    #define conditional_noop(x) std::cout << (x)   
#endif  

Веселого программирования! РЕДАКТИРОВАТЬ: добавлена ​​конструкция [do] для обеспечения устойчивости, как предложено в другом ответе.

16 голосов
/ 20 августа 2009

Определение макроса как void хорошо передает ваше намерение.

#ifdef NOOP
    #define conditional_noop(x) (void)0
#else
13 голосов
/ 20 августа 2009
 #ifdef NOOP       
     #define conditional_noop(x)   
 #elif  

ничего!

6 голосов
/ 20 августа 2009
#ifdef NOOP
    static inline void conditional_noop(int x) { }
#else 
    static inline void conditional_noop(int x) { std::cout << x; }
#endif

Использование встроенной функции void позволяет проверять тип, даже если NOOP не определено. Поэтому, когда NOOP не определен, вы все равно не сможете передать структуру этой функции или неопределенную переменную. Это в конечном итоге предотвратит появление ошибок компилятора при включении флага NOOP.

5 голосов
/ 20 августа 2009

Вы можете просто оставить это поле пустым. Вам не нужно ни за чем следовать #define.

4 голосов
/ 20 августа 2009

Как говорили другие, оставьте это поле пустым.

Трюк, который вы должны использовать, это добавить (void)0 к макросу, заставляя пользователей добавлять точку с запятой после него:

#ifdef NOOP       
    #define conditional_noop(x) (void)0
#else       
    #define conditional_noop(x) std::cout << (x); (void)0
#endif  

В C ++ (void)0 ничего не делает. В этой статье объясняется другие не очень хорошие варианты, а также обоснование, стоящее за ними.

2 голосов
/ 20 августа 2009

Поскольку это макрос, вам также следует рассмотреть случай, подобный

if (other_cond)
    conditional_noop(123);

чтобы быть в безопасности, вы можете дать пустое утверждение, как

#define conditional_noop(X) {}

для более старой версии C иногда вам нужно определить пустую оценку следующим образом (также следует оптимизировать):

#define conditional_noop(X) do {} while(0)
0 голосов
/ 23 октября 2012

Я думаю, что комбинация предыдущих вариантов - хорошее решение:

#ifdef NOOP
    static inline void conditional_noop(int x) do {} while(0)
#else 
    static inline void conditional_noop(int x) do { std::cout << x; } while(0)
#endif

Хорошо, что эти два кода отличаются только внутри блока , что означает, что их поведение снаружи полностью идентично для синтаксического анализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...