我有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;
}
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个学生。 结构体数组在定义的同时也可以初始化,例如: 当对数组中全部元素赋值时,也可不给出数组长度,例如: 结构体数组的使用也很简单,例如,获取