【发布时间】:2018-06-16 07:43:34
【问题描述】:
C 中变量初始化的宏。
#define abcd
char abcd c[] = "AJITH";
for(i=0;i<5;i++){
printf("%c",c[i]);
}
输出:-AJITH
为什么编译器没有显示错误?什么意思?
【问题讨论】:
标签: c
C 中变量初始化的宏。
#define abcd
char abcd c[] = "AJITH";
for(i=0;i<5;i++){
printf("%c",c[i]);
}
输出:-AJITH
为什么编译器没有显示错误?什么意思?
【问题讨论】:
标签: c
由于#define 没有abcd 的替换文本,任何出现的abcd 基本上都会被预处理器删除,所以
char abcd c[] = "AJITH";
变成
char c[] = "AJITH";
【讨论】:
abcd 扩展为空白。
所以char abcd c[] = "AJITH" 扩展为char c[] = "AJITH",这很好。
以下是您的程序仅在预处理后的输出 (gcc -E)
char c[] = "AJITH";
int i;
for(i=0;i<5;i++){
printf("%c",c[i]);
}
【讨论】:
在声明中
#define abcd
macro-name 没有 macro-body。所以它会用空替换macro-name。
在预处理器阶段您的以下代码之后
#define abcd
int main(void) {
char abcd c[] = "AJITH";
for(int i=0;i<5;i++){
printf("%c",c[i]);
}
return 0;
}
看起来像这样
int main(void) {
char c[] = "AJITH";
for(int i=0;i<5;i++){
printf("%c",c[i]);
}
return 0;
}
因此它打印AJITH
为什么编译器没有显示错误? #define abcd 是一个空字符串,根据 C 标准允许空定义。
来自 C11 标准 (n1570),第 6.10 节预处理指令
控制线:
# define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line replacement-list: pp-tokens(opt)
正如您在replacement-list: 上方看到的,它是令牌列表,可以为空。
【讨论】: