【问题标题】:Macro on variable initialization in c [duplicate]c中变量初始化的宏[重复]
【发布时间】: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


    【解决方案1】:

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

    char abcd c[] = "AJITH";
    

    变成

    char  c[] = "AJITH";
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在声明中

        #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: 上方看到的,它是令牌列表,可以为空。

        【讨论】:

          猜你喜欢
          • 2013-02-22
          • 2015-05-27
          • 2015-01-28
          • 2018-06-26
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-10
          相关资源
          最近更新 更多