gpt4 book ai didi

c++ - 为什么#pragma once 不防范多个非 constexpr 定义?

转载 作者:行者123 更新时间:2023-11-28 04:10:13 24 4
gpt4 key购买 nike

刚刚花了一段时间调试一个多重定义错误,但我不清楚为什么会发生这种行为,想了解一下。

我在头文件中有类似的东西。

//foo.h
#pragma once

my_states States[N] = {...};

稍后,bar.h包括 foo.h作为bar.cpp具有需要了解 my_states 的功能.

问题出现在我为 bar 编写单元测试时并包括 bar.htest.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/

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