我知道这不起作用,但希望你能看到我正在做的事情
#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...
有没有办法做到这一点,它的工作原理?
答案 0 :(得分: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);
任何包含逗号的初始化工具(例如示例中的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);
答案 1 :(得分:-1)
由于评论在预处理程序运行中被过滤掉了,我不这么认为
答案 2 :(得分:-1)
这取决于预处理器如何处理注释和宏。如果它在宏扩展之后剥离注释,那么你的顺利航行,但否则它可能不会因为预处理器的实现而起作用。
你可以试试吗? (虽然会很麻烦。)
#define MAYBE_SKIP(code) code
#define MAYBE_SKIP(code) /* code */
答案 3 :(得分:-1)
预处理器删除了注释部分。尝试运行
gcc -E source.c
这将在您的代码上运行预处理器,但实际上不会编译它,让您可以看到宏扩展后会发生什么。您应该注意到所有注释都从任何扩展的宏中删除。