• 781阅读
  • 2回复

[提问]C++ 2个结构体重名,编译器有办法发现吗? [复制链接]

上一主题 下一主题
离线wangjianxyz
 

只看楼主 倒序阅读 楼主  发表于: 2023-05-18
我有2个cpp文件,2个里面各自有一个结构体,成员不一样,但是名字恰好一样。
我使用的时候,就会出问题,2个结构体混淆了,可能会导致程序崩溃。
用g++编译的时候,g++并没有报错。
有没有方法,能主动发现类似的错误



下面的源码,运行时会直接崩溃。
而且,看打印,test_fun.cpp里面的变量,析构时,会调用main.cpp里面的析构函数。


main.cpp
  1. #include <stdio.h>
  2. #include <string>
  3. #include <vector>
  4. #include <unistd.h>
  5. #define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)
  6. int test_key_fun1();
  7. int test_key_fun2();
  8. int test_key_fun3();
  9. int a;
  10. typedef struct key_info_s{
  11.     std::string key;
  12.     std::string value;
  13.     ~key_info_s(){
  14.            ht_log_info("main::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
  15.        }
  16. }KEY_INFO_T;
  17. class KEY_ITEM_T{
  18.     std::string key;
  19.     std::string value;
  20.     int a;
  21.     int b;
  22.     int c;
  23. };
  24. int main()
  25. {
  26.    // test_key_fun2();
  27.     test_key_fun3();
  28.     test_key_fun1();
  29.      KEY_INFO_T aaaa;
  30.     while(1)
  31.     {
  32.         usleep(1e6);
  33.         int a = 34;
  34.         int b= 34;
  35.         int c = a + b;
  36.         ht_log_info("c=%d", c);
  37.     }
  38.     return 0;
  39. }
test_fun.cpp
  1. static int m_test_key1=13;
  2. #include <stdio.h>
  3. #include <string>
  4. #include <vector>
  5. #define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)
  6. typedef struct key_info_s{
  7.     int x;
  8.     int y;
  9.     std::string key;
  10.     std::string value;
  11.     int a;
  12.     int b;
  13.     int c;
  14.     ~key_info_s(){
  15.            ht_log_info("test_fun.cpp::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
  16.        }
  17. }KEY_INFO_T;
  18. class KEY_ITEM_T{
  19.     public:
  20.     int x;
  21.     int y;
  22.     std::string key;
  23.     std::string value;
  24.     int a;
  25.     int b;
  26.     int c;
  27. };
  28. static std::vector<KEY_INFO_T>   m_key_info_list;
  29. extern int a;
  30. int test_key_fun1()
  31. {
  32.     KEY_INFO_T key_info;
  33.     key_info.x = 11;
  34.     key_info.y = 12;
  35.     key_info.key = "abcd";
  36.     key_info.value = "123";
  37.     key_info.a = 21;
  38.     key_info.b = 22;
  39.     key_info.c = 23;
  40.     m_key_info_list.push_back(key_info);
  41.     KEY_INFO_T &key_info2 = m_key_info_list[0];
  42.     ht_log_info("size=%d, [%d][%d][%s][%s]", sizeof(KEY_INFO_T), key_info2.x, key_info2.y, key_info2.key.data(), key_info2.value.data());
  43.     ht_log_info("size=%d, [%d][%d][%d]", sizeof(KEY_INFO_T), key_info2.a, key_info2.b, key_info2.c);
  44.     return 0;
  45. }
  46. int test_key_fun2()
  47. {
  48.     ht_log_info("test_key_fun2:m_test_key1=%d", m_test_key1);
  49.     ht_log_info("a=%d", a);
  50.     ht_log_info("a=%lf", a);
  51.     return 1;
  52. }
  53. static std::vector<KEY_ITEM_T>   m_key_item_list;
  54. int test_key_fun3()
  55. {
  56.     KEY_ITEM_T key_info;
  57.     key_info.x = 11;
  58.     key_info.y = 12;
  59.     key_info.key = "abcd";
  60.     key_info.value = "123";
  61.     m_key_item_list.push_back(key_info);
  62.     KEY_ITEM_T &key_info2 = m_key_item_list[0];
  63.     ht_log_info("size=%d, [%d][%d][%s][%s]",sizeof(KEY_ITEM_T),  key_info2.x, key_info2.y, key_info2.key.data(), key_info2.value.data());
  64.     return 0;
  65. }





离线kaon

只看该作者 1楼 发表于: 2023-05-18
好像没办法处理UB
离线fsu0413

只看该作者 2楼 发表于: 2023-05-20
回 kaon 的帖子
kaon:好像没办法处理UB (2023-05-18 20:32) 

自信点,把好像去掉
快速回复
限100 字节
 
上一个 下一个