C++ creatAcc函数无参数仍可读取main变量是否与头文件有关?
问题原因拆解
你遇到的现象本质是C++编译链接规则下的未定义行为,和头文件声明的错误直接相关,具体分为两点:
- 编译阶段不报语法错误的原因
你main函数所在的源文件引入了creatAcc.h头文件,编译器编译main.cpp时只能看到头文件里void creatAcc(std::string registerPassword, std::string registerName, int randCode)的声明,完全不知道creatAcc.cpp里的实际实现是无参版本,所以你调用时传入三个参数完全符合编译器拿到的声明规则,自然不会报语法错误,会正常生成调用带参creatAcc的目标代码。 - 链接阶段未报错的原因
正常来说支持C++标准的编译器会做名字修饰(Name Mangling),带三个参数的creatAcc和无参的creatAcc会被修饰为完全不同的符号名,链接器会直接报「未找到带参creatAcc实现」的错误。你现在能链接通过,大概率是用了宽松的编译参数、或编译器兼容了老式C的符号匹配规则,只匹配函数原始名称creatAcc,强行把无参实现和带参调用绑定到了一起。
常见误区澄清
你以为函数读取到了main传入的变量,实际是完全的错觉:creatAcc.cpp顶部定义的registerPassword、registerName、randCode是全局变量,和main函数内部定义的同名局部变量是存储在不同内存地址的两个完全无关的对象。你函数内读写的都是全局变量的值,和main调用时传入的参数没有任何关系,只是名字相同让你产生了“读取到传入参数”的误解。
修复方案
- 保证头文件的函数声明和源文件的函数实现签名完全一致,要么都设置三个传入参数,要么都不设置
- 不要用全局变量传递上下文,要么把需要的值作为参数传入函数,要么用函数返回值带回结果
内容的提问来源于stack exchange,提问作者user14947646
相关产品推荐
相关产品推荐

