Общая Хитрость заключается в том, чтобы сделать это:
#ifdef DEBUG
#define OUTPUT(x) printf x
#else
#define OUTPUT(x)
#endif
#include <stdio.h>
int main(void)
{
OUTPUT(("%s line %i\n", __FILE__, __LINE__));
return 0;
}
Таким образом, у вас есть вся мощь printf()
доступной для вас, но вы должны мириться с двойными квадратными скобками, чтобы сделать макро работы.
Точка двойных скобок: вам нужен один набор, чтобы указать, что это макровызов, но вы не можете иметь неопределенное количество аргументов в макросе на C89. Однако, помещая аргументы в свой собственный набор скобок, они интерпретируются как один аргумент. Когда макрос расширяется, когда определено DEBUG
, заменяющим текстом является слово printf
, за которым следует аргумент singl, который на самом деле представляет собой несколько элементов в скобках. Затем скобки интерпретируются как скобки, необходимые в вызове функции printf
, поэтому все это работает.
Прямой дубликат http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1644898#1644898 и, возможно, и другие. –
@JonathanLeffler * use case * (создание макроса печати только для отладки) является дубликатом http://stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/1644898#1644898, но литальный вопрос, заданный (могу ли я включить '//' в '# define'), не является, и вопрос, заданный буквально, интересен и полезен другим. Наложение неудачно, но здесь есть особый вопрос, который имеет значение; он не должен быть закрыт. –
@MarkAmery: название - это проблема [XY Problem] (http://www.perlmonks.org/?node_id=542341) - решение, которое пытается выполнить пользователь, находится в номинированном дубликате, но вопрос просят что-то тангенциальное, которое даже не достигнет того, чего они хотят. –