当前位置: 首页 > 知识库问答 >
问题:

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

谷梁浩思
2023-05-18

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

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

main.cpp

#include <stdio.h>
#include <string>
#include <vector>
#include <unistd.h>

#define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)


int test_key_fun1();
int test_key_fun2();
int test_key_fun3();

int a;
typedef struct key_info_s{
    std::string key;
    std::string value;
    ~key_info_s(){
           ht_log_info("main::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
       }
}KEY_INFO_T;

class KEY_ITEM_T{
    std::string key;
    std::string value;
    int a;
    int b;
    int c;
};


int main()
{


   // test_key_fun2();
    test_key_fun3();
    test_key_fun1();
     KEY_INFO_T aaaa;
    while(1)
    {
        usleep(1e6);

        int a = 34;
        int b= 34;
        int c = a + b;
        ht_log_info("c=%d", c);
    }

    return 0;
}

test_fun.cpp

static int m_test_key1=13;
#include <stdio.h>
#include <string>
#include <vector>

#define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)


typedef struct key_info_s{
    int x;
    int y;
    std::string key;
    std::string value;
    int a;
    int b;
    int c;

    ~key_info_s(){
           ht_log_info("test_fun.cpp::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
       }
}KEY_INFO_T;

class KEY_ITEM_T{
    public:
    int x;
    int y;
    std::string key;
    std::string value;
    int a;
    int b;
    int c;
};

static std::vector<KEY_INFO_T>   m_key_info_list;
extern int a;
int test_key_fun1()
{
    KEY_INFO_T key_info;
    key_info.x = 11;
    key_info.y = 12;
    key_info.key = "abcd";
    key_info.value = "123";
    key_info.a = 21;
    key_info.b = 22;
    key_info.c = 23;

    m_key_info_list.push_back(key_info);

    KEY_INFO_T &key_info2 = m_key_info_list[0];
    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());
    ht_log_info("size=%d, [%d][%d][%d]", sizeof(KEY_INFO_T), key_info2.a, key_info2.b, key_info2.c);

    return 0;
}


int test_key_fun2()
{
    ht_log_info("test_key_fun2:m_test_key1=%d", m_test_key1);
    ht_log_info("a=%d", a);
    ht_log_info("a=%lf", a);
    return 1;
}

static std::vector<KEY_ITEM_T>   m_key_item_list;
int test_key_fun3()
{
    KEY_ITEM_T key_info;
    key_info.x = 11;
    key_info.y = 12;
    key_info.key = "abcd";
    key_info.value = "123";

    m_key_item_list.push_back(key_info);

    KEY_ITEM_T &key_info2 = m_key_item_list[0];
    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());

    return 0;
}

共有1个答案

公冶嘉
2023-05-18

2个源文件的具体内容,写在这里。

main.cpp

#include <stdio.h>
#include <string>
#include <vector>
#include <unistd.h>

#define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)

int test_key_fun1();
int test_key_fun2();
int test_key_fun3();

int a;
typedef struct key_info_s{
    std::string key;
    std::string value;
    ~key_info_s(){
           ht_log_info("main::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
       }
}KEY_INFO_T;

class KEY_ITEM_T{
    std::string key;
    std::string value;
    int a;
    int b;
    int c;
};


int main()
{


   // test_key_fun2();
    test_key_fun3();
    test_key_fun1();
     KEY_INFO_T aaaa;
    while(1)
    {
        usleep(1e6);

        int a = 34;
        int b= 34;
        int c = a + b;
        ht_log_info("c=%d", c);
    }

    return 0;
}

test_fun.cpp


static int m_test_key1=13;
#include <stdio.h>
#include <string>
#include <vector>

#define    ht_log_info(xx,args...)    fprintf(stderr, xx"\n", ##args)


typedef struct key_info_s{
    int x;
    int y;
    std::string key;
    std::string value;
    int a;
    int b;
    int c;

    ~key_info_s(){
           ht_log_info("test_fun.cpp::key_info_s: delete ,size=%d", sizeof( struct key_info_s));
       }
}KEY_INFO_T;

class KEY_ITEM_T{
    public:
    int x;
    int y;
    std::string key;
    std::string value;
    int a;
    int b;
    int c;
};

static std::vector<KEY_INFO_T>   m_key_info_list;
extern int a;
int test_key_fun1()
{
    KEY_INFO_T key_info;
    key_info.x = 11;
    key_info.y = 12;
    key_info.key = "abcd";
    key_info.value = "123";
    key_info.a = 21;
    key_info.b = 22;
    key_info.c = 23;

    m_key_info_list.push_back(key_info);

    KEY_INFO_T &key_info2 = m_key_info_list[0];
    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());
    ht_log_info("size=%d, [%d][%d][%d]", sizeof(KEY_INFO_T), key_info2.a, key_info2.b, key_info2.c);

    return 0;
}


int test_key_fun2()
{
    ht_log_info("test_key_fun2:m_test_key1=%d", m_test_key1);
    ht_log_info("a=%d", a);
    ht_log_info("a=%lf", a);
    return 1;
}

static std::vector<KEY_ITEM_T>   m_key_item_list;
int test_key_fun3()
{
    KEY_ITEM_T key_info;
    key_info.x = 11;
    key_info.y = 12;
    key_info.key = "abcd";
    key_info.value = "123";

    m_key_item_list.push_back(key_info);

    KEY_ITEM_T &key_info2 = m_key_item_list[0];
    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());

    return 0;
}
 类似资料:
  • 主要内容:1、定义结构体,2、结构体的特征,3、类与结构体在 C# 中,结构体也被称为结构类型(“structure type”或“struct type”),它是一种可封装数据和相关功能的值类型,在语法上结构体与类(class)非常相似,它们都可以用来封装数据,并且都可以包含成员属性和成员方法。 1、定义结构体 要定义一个结构体需要使用 struct 关键字,每个结构体都可以被看作是一种新的数据类型,其中可以包含多个成员(成员属性和成员方法),例如下面

  • 主要内容:1. 定义结构体,2. 访问结构成员,3. 结构体作为函数参数,4. 指向结构的指针,5. 位域Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项。 结构体用于表示记录,假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题 作者 学科 书名 1. 定义结构体 要定义结构体,必须使用语句。 语句定义一个新的数据类型,为程序提供多个成员。 语句的格式如下所示 - 是可选的

  • 主要内容:结构体变量,成员的获取和赋值前面的教程中我们讲解了 数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。 在C语言中,可以使用 结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{    

  • 在 C# 中,结构体是一种值数据类型。包含数据成员和方法成员。 struct 关键字是用于创建一个结构体。 结构体是用来代表一个记录。假设你想追踪一个图书馆的书。你可能想追踪每本书的属性如下: 标题 作者 类别 书号 定义一个结构体 定义一个结构体,你必须要声明这个结构体。结构体声明定义了一种新的数据类型,这个数据类型为你的程序包含了一个以上的成员变量。 例如,你可以声明一个书的结构如下: str

  • 主要内容:获取结构体成员,结构体指针作为函数参数当一个 指针变量指向结构体时,我们就称它为 结构体指针。 C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: 也可以在定义结构体的同时定义结构体指针: 注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加 ,所以给 pstu 赋

  • 所谓 结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中, C语言结构体数组常被用来表示一个拥有相同 数据结构的群体,比如一个班的学生、一个车间的职工等。 在C语言中,定义结构体数组和定义结构体变量的方式类似,请看下面的例子: 表示一个班级有5个学生。 结构体数组在定义的同时也可以初始化,例如: 当对数组中全部元素赋值时,也可不给出数组长度,例如: 结构体数组的使用也很简单,例如,获取