Как я не реализую никакого-op макроса (или шаблон) в C++?

Инструменты> Опции> Шрифты и Цвета> "Экспонаты": простой текст

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

25
задан lillq 2 September 2009 в 03:04
поделиться

8 ответов

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

#include <iostream>   

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

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

24
ответ дан 28 November 2019 в 17:37
поделиться

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

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

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

52
ответ дан 28 November 2019 в 17:37
поделиться

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

#ifdef NOOP
    #define conditional_noop(x) (void)0
#else
16
ответ дан 28 November 2019 в 17:37
поделиться
 #ifdef NOOP       
     #define conditional_noop(x)   
 #elif  

ничего!

13
ответ дан 28 November 2019 в 17:37
поделиться

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

5
ответ дан 28 November 2019 в 17:37
поделиться
#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 .

6
ответ дан 28 November 2019 в 17:37
поделиться

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

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

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

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

4
ответ дан 28 November 2019 в 17:37
поделиться

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

if (other_cond)
    conditional_noop(123);

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

#define conditional_noop(X) {}

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

#define conditional_noop(X) do {} while(0)
2
ответ дан 28 November 2019 в 17:37
поделиться