По крайней мере, в 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
).
В настоящий момент нет портативного способа сделать это. (Я считаю, что есть ожидающее предложение, которое позволит вам построить что-то вроде этого.) –
Я имею в виду, посмотрите на Boost.Preprocessor, возможно, есть * какая-то магия, которая может это достичь. (Который должен работать и на C.) –
Мех, все в порядке, мне было просто любопытно, если бы это было возможно. Так как это не так, я бы просто определил что-то вроде '#define C0 (char * []) {0}' –