Подтвердить что ты не робот

Как реализовать макрос (или шаблон) no-op в С++?

Как реализовать макрос no-op в С++?

#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 не определен.

4b9b3361

Ответ 1

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

#include <iostream>   

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

Получайте удовольствие от кодирования! EDIT: добавлена ​​конструкция [do] для обеспечения надежности, как было предложено в другом ответе.

Ответ 2

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

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

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

Ответ 3

 #ifdef NOOP       
     #define conditional_noop(x)   
 #elif  

ничего!

Ответ 4

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

#ifdef NOOP
    #define conditional_noop(x) (void)0
#else

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

if (other_cond)
    conditional_noop(123);

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

#define conditional_noop(X) {}

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

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

Ответ 9

Я думаю, что сочетание предыдущих вариантов является хорошим решением:

#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

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