我有 2 个 cpp 文件,2 个里面各自有一个结构体,成员不一样,但是名字恰好一样。
我使用的时候,就会出问题,2 个结构体混淆了,可能会导致程序崩溃。
用 g++ 编译的时候,g++ 并没有报错。
有没有方法,能主动发现类似的错误?
main.cpp
typedef struct key_info_s{
std::string key;
std::string value;
std::string key2;
int a[10];
~key_info_s(){
log_info("main::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
}
}KEY_INFO_T;
test_fun.cpp
typedef struct key_info_s{
public:
int x;
int y;
std::string key;
std::string value;
int a;
int b;
int c;
~key_info_s(){
log_info("test_fun::key_info_s: delete");
}
}KEY_INFO_T;
在C++中,如果你在不同的文件中定义了两个结构体,虽然它们的名称相同,但是它们是不同的类型。这是由于每个结构体的定义在其所在的文件中是局部的。
编译器不会报错,因为它会将每个结构体的定义视为不同的类型。这种情况下,编译器无法自动检测到结构体名称的冲突,因为它们被视为不同的实体。
如果你想避免这种混淆并确保两个结构体没有相同的名称,可以使用命名空间来将它们分隔开。例如,你可以在每个结构体所在的文件中创建一个命名空间,并将结构体放在命名空间中,这样可以确保它们的名称在全局范围内是唯一的。
main.cpp:
cpp
Copy code
namespace main_namespace {
typedef struct key_info_s {
std::string key;
std::string value;
std::string key2;
int a[10];
~key_info_s(){
log_info("main::key_info_s: delete ,size=%d", sizeof(struct key_info_s));
}
} KEY_INFO_T;
}
test_fun.cpp:
cpp
Copy code
namespace test_fun_namespace {
typedef struct key_info_s {
int x;
int y;
std::string key;
std::string value;
int a;
int b;
int c;
~key_info_s(){
log_info("test_fun::key_info_s: delete");
}
} KEY_INFO_T;
}
现在,每个结构体都被放置在自己的命名空间中,它们的名称是唯一的。这样,在你的代码中使用结构体时,需要使用完整的名称,包括命名空间前缀。
另外,如果你想在编译时捕获类似的错误,你可以考虑使用静态代码分析工具,如Clang静态分析器(Clang Static Analyzer)或Cppcheck。这些工具可以帮助你检测代码中的潜在问题,包括重复定义的结构体名称等。
c++ 是按照 cpp 文件单独编译的 一个文件一个 .o,从理论上讲,从编译期就很难发现,除非你include到了,那就会有重定义错误。
还有一种更隐蔽的错误 就是 在第三方的so中和你自己写的代码中出现了相同的类名,更是难以发现。
所以说,还是要乖乖加上命名空间吧。
建议使用命名空间解决此问题
编译时不会报错,链接时是不是会链接错导致程序运行错误?不懂,有无大神解答?