Возможно ли # определить два слова для некоторого выражения, а не только одно слово?

Если я хочу заменить все вхождения byte на unsigned char, это просто #define. Есть ли способ сделать обратное с помощью #define? Группирование двух слов с помощью одиночных или двойных кавычек не работает, а также не позволяет пробелу между ними с помощью обратного слэша. Возможно ли это?

Ответы

Ответ 1

Идентификатор в операторе #define не может содержать пробелы, по крайней мере, в C.

Контрольная часть стандарта C11 (хотя это по существу то же самое в предыдущих итерациях) - 6.10.3 Macro replacement/9-10 (объединенная ниже):

Директива предварительной обработки формы

# define identifier replacement-list new-line
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen... ) replacement-list new-line
# define identifier lparen identifier-list ,... ) replacement-list new-line

бла бла бла...

identifier (используемый в этих директивах) указан в 6.4.2 того же стандарта и не указывает пробельный символ как один из разрешенных.

Ответ 2

СинтаксиС#define определяется

#define identifier token-string

Таким образом, средняя часть должна быть идентификатором, который не может содержать пробел.

Ответ 3

Хотя принятый ответ полностью технически корректен, может быть сразу не ясно, что синтаксис #define дает такие вещи, как:

extern CString outputString;
#define printf( ... ) { CString temp; temp.Format( __VA_ARGS__ ); outputString += temp; }

Единственные элементы, которые вам действительно нужны здесь, - это ... и __VA_ARGS__. Они представляют собой список ноль или более токенов. Таким образом, это ограниченный пример того, где #define будет интерпретировать (но по существу игнорировать) пробелы и позволяет вам изменять несколько слов во что-то другое.

Хотя я никогда не делал этого сам, предположительно, если у вас есть функция с параметрами по умолчанию и вызывает эту функцию, которая, как представляется, имеет список аргументов переменной длины (хотя список истинных аргументов имеет фиксированную длину), вы все равно можете использовать синтаксис ... и __VA_ARGS__ для вызова совместимой функции:

#define ThreeParamFunction( x, ... ) FiveParamFunction( foo, bar, (x), __VA_ARGS__ )