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

时间:2009-09-30 11:44:33

标签: 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...

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

4 个答案:

答案 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

这将在您的代码上运行预处理器,但实际上不会编译它,让您可以看到宏扩展后会发生什么。您应该注意到所有注释都从任何扩展的宏中删除。