[C]中的预处理器

时间:2016-03-27 09:01:58

标签: c macros

我正在处理预处理器,根据我的情况,在这种情况下输出应为50 50!由于这个问题我的预处理器的cocept受到影响,请生动地解释这个概念并输出!提前致谢

   #include <stdio.h>
   #define a 10
   void foo(){printf("\n%d",a);}
   int main()
   {
    #define a 50
    printf("\n%d",a);
    foo();
    getchar();
    return 0;
    }

3 个答案:

答案 0 :(得分:3)

让我们一步一步地完成它:

       var full_list="";
        for(var i=0;i<arrayResults.length;i++){ 
            // alert(arrayResults[i]._id);
            // alert(arrayResults[i].json.name); 
            // alert(arrayResults[i].json.age);
           full_list =  full_list + arrayResults[i].json.name + " " + arrayResults[i]._id + " is " + arrayResults[i].json.age + '<br />';
        $("#demo").append(full_list);  

         }

首次替换使这个:

#define a 10
void foo(){printf("\n%d",a);}
int main()
{
    #define a 50
    printf("\n%d",a);
    foo();
    getchar();
    return 0;
}

其次,我们将重新定义10号,这是危险的

void foo(){printf("\n%d",10);}
int main()
{
    #define 10 50
    printf("\n%d",10);
    foo();
    getchar();
    return 0;
}

我只是试图避免这种代码,确保您的编译器将此报告为警告(或甚至将其提升为错误),例如void foo(){printf("\n%d",10);} int main() { printf("\n%d",50); foo(); getchar(); return 0; }

答案 1 :(得分:1)

首先,您不应该将预处理器视为语言的一部分,而应将其作为在编译器之前运行的单独程序,并将源转换为编译器使用的translation unit。这样的思考使得更容易理解预处理器使用的语言与C不同,这意味着C语言的规则不适用于预处理器。

预处理器宏与C变量不同,不能这样使用,并且由于C语言中没有作用域,因此无法重新定义宏。一次为输入文件的其余部分和所有后续包含文件定义的宏。

答案 2 :(得分:0)

想象一下,每个预处理器行在编译时构成一个脚本运行器。这个脚本最奇怪的是它会影响下面的代码。因此,如果要在程序中间更改给定宏的值,则需要在进行另一个定义之前取消。这样做会在遇到undef时立即停止宏替换,并且您的代码将按预期工作。