используя макросы для размещения #ifdef в коде - PullRequest
0 голосов
/ 15 апреля 2011

Я пытаюсь сделать что-то подобное

#define VB_S #ifdef VERBOSE
#define VB_E #endif

чтобы в коде вместо записи

#ifdef VERBOSE
    cout << "XYZ" << endl;
#endif

Я могу написать

VB_S  
    cout << "XYZ" << endl; 
VB_E

Это дает мне ошибку во время компиляции: "Стрела" в программе.

Может ли кто-нибудь осветить, как правильно это сделать

Ответы [ 4 ]

6 голосов
/ 15 апреля 2011

Нельзя помещать директивы в макросы.(# внутри макроса в качестве другого значения - это оператор строки; за ним должен следовать идентификатор параметра - но ограничение старше этого значения)

3 голосов
/ 15 апреля 2011

Вы можете сделать что-то вроде этого:

#ifdef VERBOSE
#define VB(x) x
#else
#define VB(x) do { } while (false)
#endif


VB(cout << "foo");
2 голосов
/ 15 апреля 2011

Я предпочитаю следующее:

#define VERBOSE 1
// or 0, obviously

if (VERBOSE)
{
// Debug implementation
}

Это немного более читабельно, поскольку VB_S ничего не значит для обычного пользователя, но если (VERBOSE) -.

2 голосов
/ 15 апреля 2011

Аналогично ответу Эрика:

#ifdef VERBOSE
#define VB(...) __VA_ARGS__
#else
#define VB(...) /* nothing */
#endif

Использование макроса variadic позволяет запятыми внутри вызова VB(). Также, AFAIK, вы можете удалить do ... while.

...