Из стандарта C99:
Директива предварительной обработки вида
# определение идентификатора списка замен новой строки
определяет объектоподобный макрос, который вызывает замену каждого последующего экземпляра имени макроса списком замены токенов предварительной обработки, которые составляют остаток директивы.
Таким образом, макросы работают с токенами и ожидается пробел.
И вы можете получить желаемый результат, используя оператор вставки токена, ##
, но для этого вам нужно использовать еще несколько макросов:
#define PASTE2( x, y) x##y
#define PASTE( x, y) PASTE2(x, y)
#define _ -F<00||--F-OO--;
PASTE(PASTE(PASTE(PASTE(_,-),_),-),_)
Так что я не уверен, что это реальный ответ для вас.
Вы можете использовать менее уродливый набор макросов для получения нужных выражений - пробелы все еще будут, но пробелы не будут мешать созданию операторов --
:
_ PASTE(-,_) PASTE(-,_)
Я все еще сомневаюсь, что ты этого хочешь.