Если я хочу заменить все вхождения 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__ )