不同C文件中宏名与全局标识符同名时链接会产生什么结果
链接结果说明
两个文件共同链接时不会出现报错,可正常生成可执行程序,核心原因是两者的MAX_N属于完全不同的语法范畴,不会触发符号冲突:
file1.c中的#define MAX_N 99是预处理宏定义,仅在file1.c的预处理阶段生效,预处理器会直接把file1.c内所有MAX_N字面量替换为数值99,编译完成后file1.o目标文件里不会生成任何名为MAX_N的全局符号,不存在和其他文件符号冲突的基础。file2.c中的int MAX_N=99;是全局变量定义,会在file2.o目标文件中导出MAX_N全局符号,链接时没有其他目标文件导出同名符号,自然不会出现重定义报错。
特殊场景补充:如果在
file1.c中写了extern int MAX_N;尝试声明并调用file2.c的这个全局变量,会直接在编译阶段报语法错误,因为预处理阶段会把该行代码替换为extern int 99;,属于非法语法。
内容的提问来源于stack exchange,提问作者icancar99
相关产品推荐
相关产品推荐

