可选的初始化程序,通过预处理器技巧?

Mic*_*ick 2 c c-preprocessor

我知道这不起作用,但希望你能看到我正在努力做的事情

#if ASSIGN_ALLOWED
    #define MAYBE_SKIP_REST_OF_LINE 
#else
    #define MAYBE_SKIP_REST_OF_LINE ; //
#endif

char str[80]  MAYBE_SKIP_REST_OF_LINE = "Hello\n";
long array[3] MAYBE_SKIP_REST_OF_LINE = { 7,8,9 };
int x         MAYBE_SKIP_REST_OF_LINE = 3;
//...many many more similar lines...
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,它的工作原理?

caf*_*caf 9

当然:

#ifdef ASSIGN_ALLOWED
    #define OPTIONAL_INITIALISER(x) = x 
#else
    #define OPTIONAL_INITIALISER(x) 
#endif

char str[80] OPTIONAL_INTIALISER("Hello\n");
#define ARRAY_INIT { 7,8,9 }
long array[3] OPTIONAL_INITIALISER(ARRAY_INIT);
#undef ARRAY_INIT
int x OPTIONAL_INITIALISER(3);
Run Code Online (Sandbox Code Playgroud)

任何包含逗号的初始化程序(如array示例中所示)都需要从它们自己的宏中扩展,ARRAY_INIT如上所述.如果您的编译器支持C99 varargs宏,那么您可以更清洁地执行此操作:

#ifdef ASSIGN_ALLOWED
    #define OPTIONAL_INITIALISER(...) = __VA_ARGS__ 
#else
    #define OPTIONAL_INITIALISER(...) 
#endif

char str[80] OPTIONAL_INTIALISER("Hello\n");
long array[3] OPTIONAL_INITIALISER({ 7,8,9 });
int x OPTIONAL_INITIALISER(3);
Run Code Online (Sandbox Code Playgroud)