内部和外部结构的符号冲突,C++ vs C
Symbol clashing of inner and outer structs, C++ vs C
所以,假设我有以下C++标题,testheader.h
:
struct mystruct
{
struct myinnerstruct
{
int x;
} astruct;
};
struct myinnerstruct
{
int x;
};
以及以下C++来源,test.cpp
:
#include "testheader.h"
using namespace std;
int main()
{
return 0;
}
G++ 在编译/链接期间没有问题。
现在,如果我有相同的标头,但不是C++源,则 C 源文件test.c
:
#include "testheader.h"
int main()
{
return 0;
}
我用gcc编译,我得到以下错误:
error: redefinition of struct myinnerstruct
那么,我收集到C版本的作用域是翻译单元,而C++版本是块范围的?有人可以确认是这种情况,也许给我一个为什么有意义的理由吗?我正在混合 C 和 C++ 代码,这给我带来了很多麻烦。
任何见解都非常感谢。 谢谢!
在 C 中,嵌套结构实际上并不存在于其父作用域中。然而,在C++他们这样做 - teststruct::innerstruct
与innerstruct
是不同的类型。这是为了改进C++代码中的封装。例如,如果没有此规则,同一命名空间中的任何两个类型都无法定义嵌套的iterator
类,这将是非常糟糕的。
C 以许多其他非常愚蠢的方式处理结构,所以他们在这里做错事也就不足为奇了。然而,C 不允许类型范围,在这里有一个理智的规则会给语言引入许多其他概念——最终,它需要引入 namespace
s,但由于某种原因从未这样做过。
在 C 语言中,内部结构的定义超出了外部结构,这在C++中并非如此。
这在本博客中已经解释过:ISO C 和 ISO C++之间的不兼容性在 C 与 C++ 中参考 C99 和 C++98 ISO 标准的许多其他内容。
C 中没有作用域,所以一切都在"全局"命名空间中(C++说(
在机器人 C 和 C++ 中工作的更简洁的方法是:
struct myinnerstruct
{
int x;
};
struct mystruct
{
struct myinnerstruct astruct;
};
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- VS 2017 使用交叉编译器构建 x64 项目