我知道这不起作用,但希望你能看到我正在努力做的事情
#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)
有没有办法做到这一点,它的工作原理?
当然:
#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)