【发布时间】:2014-07-24 00:18:58
【问题描述】:
我对我的问题做了一个简单的简化:
#define STR_BEG "
#define STR_END "
int main()
{
char * s = STR_BEG abc STR_END;
printf("%s\n", s);
}
编译时出现以下错误:
static2.c:12:16: error: expected expression
char * s = STR_BEG abc STR_END;
^
static2.c:7:17: note: expanded from macro 'STR_BEG'
#define STR_BEG "
现在,如果我只运行预处理器gcc -E myfile.c,我会得到:
int main()
{
char * s = " abc ";
printf("%s\n", s);
}
这正是我想要的,并且是完全合法的结果代码。那么有什么关系呢?
【问题讨论】:
-
预处理器根据预处理器标记工作,而不是任意字符。
-
如果是这样,那为什么我在运行预处理器(-E)时没有报错,只有在我尝试编译时才报错?
-
我应该更清楚一点:预处理阶段的输出是一个标记序列,而不是一个字符序列。您的输出标记序列不是有效的 C 程序。您没有一个“字符串文字”标记,而是三个无效标记(或者更确切地说是两个无效标记和一个随机标识符)。
标签: c macros c-preprocessor