c中变量初始化的宏

时间:2018-06-16 07:43:34

标签: c

C中变量初始化的宏。

#define abcd

char abcd c[] = "AJITH";

for(i=0;i<5;i++){
    printf("%c",c[i]);
}

输出: - AJITH

为什么没有编译器显示错误?这是什么意思?

3 个答案:

答案 0 :(得分:0)

由于#define没有abcd的替换文字,预处理器基本上会删除abcd的任何出现,所以

char abcd c[] = "AJITH";

变为

char  c[] = "AJITH";

答案 1 :(得分:0)

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]);                                                             
 }  

答案 2 :(得分:0)

声明

#define abcd

macro-body没有macro-name。所以它将一无所获取代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是一个空字符串&amp;根据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:以及令牌列表&amp;这可能是空的。