2016-09-02 2 views
13

У меня есть макрос так:C препроцессор Удалить Запятая

#define C(a...) (char *[]){ a, 0 } 

Это работает для непустых аргументов:

C("a", "b") => (char *[])("a", "b", 0 } 

Но я хочу, чтобы удалить Запятая при условии, с пустой аргумент:

C() => (char *[]){ , 0 } 

Возможно ли это?

+1

В настоящий момент нет портативного способа сделать это. (Я считаю, что есть ожидающее предложение, которое позволит вам построить что-то вроде этого.) –

+0

Я имею в виду, посмотрите на Boost.Preprocessor, возможно, есть * какая-то магия, которая может это достичь. (Который должен работать и на C.) –

+0

Мех, все в порядке, мне было просто любопытно, если бы это было возможно. Так как это не так, я бы просто определил что-то вроде '#define C0 (char * []) ​​{0}' –

ответ

4

По крайней мере, в GCC 5.4.0, на Cygwin (default -std=gnu11), это, кажется, что вы хотите (предполагая, что я правильно понимаю ваш вопрос):

#define C(a...) (char *[]){ a 0 } 
           ^no comma!  
C("a", "b",) 
     ^comma here 
=> (char *[])("a", "b", 0 } 

C() 
=> (char *[]){ 0 } 

Испытано с gcc -E и никакой другой командной строки опции.

Редактировать Как отметил @KerrekSB, это не переносится. GCC preprocessor docs есть это сказать (курсив):

выше объяснение неоднозначно о том случае, когда только макро параметр является переменным параметром аргументы , как это [как в этой ситуации Ред.] бессмысленно пытаться отличить, не содержит ли вообще никакого аргумента пустой аргумент или отсутствующий аргумент. В этом случае стандарт C99 ясно, что запятая должна оставаться, однако существующее расширение GCC используется для проглатывания запятой. Таким образом, CPP сохраняет запятую в соответствии со специальным стандартом C и оставляет ее иначе.

Таким образом, вышеизложенное отлично работает в GCC, но может и не на других компиляторах. Тем не менее, он работает для меня с gcc -std=c90 -E (или c99, или c11).

+0

Это незначительная неприятность в эстетическом смысле, чтобы напечатать конечную запятую в каждом вызове макроса, который лично говорить не стоит, но технически выглядит единственным (на данный момент) фактическим обходным решением для этого вопроса. –

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