ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

1.8 C++踩坑排雷手册——静态成员的类内初始化与 ODR:C++17 前后规则不同

1.8 C++踩坑排雷手册——静态成员的类内初始化与 ODR:C++17 前后规则不同 1.8 C++实战100例——静态成员的类内初始化与ODR:C++17前后规则不同受众中级工程师,已掌握静态成员变量的基本用法,能区分声明与定义,了解链接过程的基本概念。默认具备基础 Linux 操作能力和编译链接调试能力。场景锚定场景:你在 C++14 项目中给类的静态成员变量在类内赋了初值(static const int x = 10;),编译通过,链接正常。升级到 C++17 后同样代码编译通过。但当你在 C++14 中尝试对非const的静态成员(static int x = 10;)做类内初始化时,链接器报undefined reference错误;而在 C++17 中同样的代码却编译链接成功。你搞不清规则变化,也不知道该在哪里加定义。这篇文章给你三条编译命令(分属 C++11、C++14、C++17),一条链接器报错定位命令和一条nm符号观察命令,直接看穿静态成员在不同标准下的 ODR 处理差异。摘要静态成员变量的类内初始化规则在 C++17 前后有根本性变化。C++17 之前,只有static const整型/枚举类型的静态成员可以在类内初始化,且不产生 ODR 定义(One Definition Rule,单一定义规则,要求每个变量在整个程序中只有一个定义),需要在类外单独提供定义(int S::x;
返回列表