首页 新闻 会员 周边

C++ 2 个结构体重名,g++ 有办法发现吗?

0
[待解决问题]

我有 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;

飞天辉的主页 飞天辉 | 菜鸟二级 | 园豆:210
提问于:2023-05-18 13:46
< >
分享
所有回答(4)
1

在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。这些工具可以帮助你检测代码中的潜在问题,包括重复定义的结构体名称等。

Technologyforgood | 园豆:5633 (大侠五级) | 2023-05-18 21:56
1

c++ 是按照 cpp 文件单独编译的 一个文件一个 .o,从理论上讲,从编译期就很难发现,除非你include到了,那就会有重定义错误。

还有一种更隐蔽的错误 就是 在第三方的so中和你自己写的代码中出现了相同的类名,更是难以发现。

所以说,还是要乖乖加上命名空间吧。

Smalldy | 园豆:430 (菜鸟二级) | 2023-05-23 16:43
0

建议使用命名空间解决此问题

iamy | 园豆:402 (菜鸟二级) | 2023-10-01 01:49
0

编译时不会报错,链接时是不是会链接错导致程序运行错误?不懂,有无大神解答?

AtanChen | 园豆:455 (菜鸟二级) | 2023-10-30 10:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册