- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚刚花了一段时间调试一个多重定义错误,但我不清楚为什么会发生这种行为,想了解一下。
我在头文件中有类似的东西。
//foo.h
#pragma once
my_states States[N] = {...};
稍后,bar.h
包括 foo.h
作为bar.cpp
具有需要了解 my_states
的功能.
问题出现在我为 bar
编写单元测试时并包括 bar.h
在 test.cpp
.
bar.o: multiple definition of MyNamespace::named_states
test.o: first defined here
我已经通过更改为
解决了这个问题 constexpr my_states States[n] = {...};
在 foo.h
.
但是我不明白为什么这解决了这个问题。我知道我对符号 my_states
有多个定义这混淆了链接器,但如果我有我的 #pragma once
guard 到位,为什么要多次定义?我不确定为什么需要 constexpr
限定符表示这应该只有 1 个定义,据我所知 #pragma once
一开始就应该阻止编译器尝试创建多个定义。
最佳答案
#pragma once
只确保头文件只包含一次,它不处理代码。
关于你关于 my_states
的第二个问题 - 在没有 constexpr
的情况下,你试图定义一个可以在运行时(或类似的东西)修改的全局变量。通过在 header 中设置其状态,您实际上使包含此 header 文件的每个库实例化并包含变量,而它应该是唯一定义的……基本上它是一个无法编译的完整困惑。您可以在头文件中声明静态/全局变量,但您应该在单个 cpp 文件中实例化它们。
通过将 constexpr
添加到变量声明中,您向编译器传达了它在运行时无法修改的信息,此外,它的值在编译时是已知的。所以不用担心哪个库存储/实例化它或任何类似的东西,因为它是编译时已知的绝对常量。
关于c++ - 为什么#pragma once 不防范多个非 constexpr 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57966207/
我正在使用 MongoDB作为我的数据库,并且作为新手后端开发人员,删除整个数据库/集合的轻松程度确实困扰着我。 只需输入 db.collection.remove()从该集合中删除所有记录! 我知道
我在项目中使用 Require.js。如果您正在定义一个模块,变量 define 将被添加到全局命名空间。 最近我有一个变量名冲突[但奇怪的是,只在 Safari 中],因为有一个 ID 为 defi
我是一名优秀的程序员,十分优秀!