Да . Оператор конкатенации препроцессора (##
) вызовет проблемы, например:
#define _add_penguin(a) penguin ## a
#define add_penguin(a) _add_penguin(a)
#define WIDTH (100)
#define HEIGHT 200
add_penguin(HEIGHT) // expands to penguin200
add_penguin(WIDTH) // error, cannot concatenate penguin and (100)
То же самое для строкового преобразования (#
). Очевидно, что это угловой случай, и, вероятно, не имеет значения, учитывая, как предположительно будет использоваться WIDTH
. Тем не менее, о препроцессоре следует помнить кое-что.
(Причина, по которой добавление второго пингвина завершается неудачей, является тонкой деталью правил предварительной обработки в C99 - iirc - это происходит сбой, потому что объединение двух токенов предварительной обработки без заполнителей всегда должно приводить к одному токену предварительной обработки - но это не имеет значения, даже если бы конкатенация была разрешена, она все равно дала бы другой результат, чем без скобок #define
!).
Все остальные ответы верны только в том случае, если это не имеет значения с точки зрения сканера C ++, поскольку число действительно является атомарным. Однако в моем прочтении этого вопроса нет никаких признаков того, что следует рассматривать только случаи без дальнейшего расширения препроцессора, поэтому другие ответы, даже если я полностью согласен с содержащимися в нем рекомендациями, неверны.