Возможно ли # определить два слова для некоторого выражения, а не только одно слово?
Если я хочу заменить все вхождения 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__ )