2016-09-21 4 views
1

Учитывая следующий код, который выводит строку, которая является stringification из двух слов:Stringification макрос всегда добавляет один символ пробела

#define PORT_INFO_MAC_2(portNum) port:  portNum 

#define PORT_INFO_MAC(portNum) PORT_INFO_MAC_2(portNum) 

/* Stringify macro expansion instead of the macro itself */ 
#define INVOKE_MACRO(...) #__VA_ARGS__ 

printf(" %s " , INVOKE_MACRO(PORT_INFO_MAC(1))); /* In a more general way, I'll be using it like follows: INVOKE_MACRO(PORT_INFO_MAC(2), PORT_INFO_MAC(1), ...) */ 

Выход всегда " port: 1 " с одним пробелом между "port" и "1". Почему там всегда есть одно пространство и есть ли способ контролировать количество пробелов?

Изменение объема пробелов в PORT_INFO_MAC_2 с помощью макроса между port и portNum не влияет на количество выводимого пространства.

EDIT
Кажется, что есть два случая, в кулак случае port и portNum являются closest- PORT_INFO_MAC_2(portNum) port:portNum, которые тогда нет места существуют на выходе между ними. Во втором случае, когда в макросе между ними существует любое количество пробелов, количество пробелов на выходе всегда равно 1. Есть ли какое-либо официальное объяснение этому? Есть ли контроль над этим?

+2

Примечание: «пробел» - это большая кнопка на клавиатуре, которая генерирует символы _space_. – Olaf

ответ

2

Почему всегда существует одно пространство и есть способ контролировать количество пробелов?

Потому что это то, что оператор stringification указан сделать:

Если в списке замещения, параметр непосредственно предшествует # предобработки маркера, оба заменены одной строкой символов буквальной токен предварительной обработки, который содержит правописание последовательности токенов предварительной обработки для соответствующего аргумента. Каждое появление пробела между токенами препроцессора аргумента становится символом пробела в символьном строковом литерале.

(C2011 6.10.3.2/2; курсив)

Конечно, если нет пробельного вообще между предобработкой лексемами, то никто не появляется в stringification.

+0

Пятно на. Можете ли вы предоставить ссылку на исходный документ? – user2162550

+0

@ user2162550, я обычно ссылаюсь на [версию PDF проекта N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf). Мой ответ содержит номера разделов и абзацев. Вы можете найти другие версии, включая HTML-версии, Googling для «n1570». Окончательный стандартный документ недоступен бесплатно, но он имеет только тривиальные отличия от N1570. –

Смежные вопросы