C++链接两个cpp文件时无法正常使用头文件中struct结构体变量问题问询
问题原因
- 头文件引用逻辑颠倒:你在
Header.h中引入了Admin.cpp和Client.cpp,正确的依赖逻辑是cpp文件引入头文件,头文件绝不应该引入cpp文件,否则会触发循环依赖、代码重复编译问题。 - 全局变量重复定义:你直接在
Header.h中定义了sNam、sNam1两个全局结构体实例,每一个引入该头文件的cpp文件都会独立生成一份变量拷贝,链接时会报重复定义错误;就算侥幸通过链接,两个cpp文件访问的也不是同一个变量,自然无法读取到对方修改后的值。 - 函数声明缺失:
Admin.cpp中的main2函数没有提前声明,你现在能调用成功完全是因为头文件错误引入了Admin.cpp的代码,属于错误的临时生效逻辑。
可行解决方案
第一步:修改Header.h
移除对cpp文件的引用,仅保留结构体定义、全局变量声明、函数声明:
#pragma once #include <string> // 定义结构体类型 struct Names { std::string sNames; std::string sNames1 = "John"; }; // 用extern声明全局变量,告知编译器该变量在其他编译单元定义 extern Names sNam, sNam1; // 声明main2函数,供其他cpp调用 void main2();
第二步:修改Admin.cpp
在这里定义全局结构体实例(全项目唯一),移除无用头引用:
#include <iostream> #include "Header.h" // 全局变量唯一的定义位置 Names sNam, sNam1; using namespace std; void main2() { if (sNam.sNames == sNam1.sNames1) { cout << "Correct Entry...\n"; } else { cout << "Incorrect Entry...\n"; } }
第三步:修改Client.cpp
移除无用的头引用,保留业务逻辑即可:
#include <iostream> #include "Header.h" #include <string> using namespace std; int main() { cout << "Please enter a name: " << flush; cin >> sNam.sNames; main2(); return 0; }
编译说明
编译时仅需要编译两个cpp文件即可,不需要把头文件加入编译列表,以gcc为例编译命令为:g++ Client.cpp Admin.cpp -o test
运行生成的可执行文件即可正常实现功能。
内容的提问来源于stack exchange,提问作者Calmtb2019
相关产品推荐
相关产品推荐

