我正在处理预处理器,根据我的情况,在这种情况下输出应为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;
}
答案 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时立即停止宏替换,并且您的代码将按预期工作。