gpt4 book ai didi

C++/结构范围

转载 作者:行者123 更新时间:2023-11-28 02:17:30 25 4
gpt4 key购买 nike

在下面的代码中,我认为结构 stSameNameButDifferent 是局部作用域定义,因此没有问题。但是我在运行时出错了。(错误:进程崩溃)

你能解释一下这段代码有什么问题吗?

测试函数.h

#ifndef TEST_FUNC_H_
#define TEST_FUNC_H_
void test_a();
void test_b();

#endif

主要.cpp

#include <iostream>
#include "test_function.h"

using namespace std;

int main(int argc, const char** argv)
{
cout << "testing for struct scope" << endl;
test_a();
test_b();
return 0;
}

test_a.cpp

#include <iostream>
#include <sstream>
#include <cstdint>
#include <list>
#include "test_function.h"

struct stSameNameButDifferent
{
uint32_t nPlayCode;
uint32_t nGameID;
std::string sGameName;
};

void test_a()
{
std::list<stSameNameButDifferent> lstSt;
for(int i=0; i<10; ++i)
{
stSameNameButDifferent st;
st.nPlayCode = i;
st.nGameID = 100+i;
std::ostringstream osBuf;
osBuf << "Game_" << i;
st.sGameName = osBuf.str();
lstSt.push_back(st);
}
for(auto &st : lstSt)
{
std::cout << st.nPlayCode << ", " << st.nGameID << ", " << st.sGameName << std::endl;
}
}

test_b.cpp

#include <iostream>
#include <sstream>
#include <cstdint>
#include <list>
#include "test_function.h"

struct stSameNameButDifferent
{
uint32_t nPlayCode;
uint32_t nGameID;
float fDiscountRate;
std::string sGameName;
};

void test_b()
{
std::list<stSameNameButDifferent> lstSt;
for(int i=0; i<10; ++i)
{
stSameNameButDifferent st;
st.nPlayCode = i;
st.nGameID = 1000+i;
st.fDiscountRate = (float)i/100;
std::ostringstream osBuf;
osBuf << "Game_" << i;
st.sGameName = osBuf.str();
lstSt.push_back(st);
}
for(auto &st : lstSt)
{
std::cout << st.nPlayCode << ", " << st.nGameID << ", " << st.sGameName << std::endl;
}
}

最佳答案

为了避免多个翻译单元中相同的 struct 名称发生冲突,您必须将它们放在一个未命名的命名空间中,如下所示:

namespace {
struct stSameNameButDifferent {
uint32_t nPlayCode;
uint32_t nGameID;
std::string sGameName;
};
}

这将使 stSameNameButDifferent 只能在相应的翻译单元(.cpp 文件)中私下看到。

否则链接器将使用找到的第一个符号解析符号,因此会出现您在运行时看到的错误。

关于C++/结构范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com