gpt4 book ai didi

c++ - 根据 MSVC,具有 volatile 成员的结构不再是 POD

转载 作者:行者123 更新时间:2023-12-01 14:49:27 24 4
gpt4 key购买 nike

#include <cstdint>
#include <type_traits>

extern "C"
{
struct thread_shared_struct
{
volatile uint32_t ccr;
};

struct thread_shared_struct getStuff();
}

static_assert(std::is_pod<thread_shared_struct>::value, "thread_shared_struct isn't a POD");

int main(int argc, char** argv)
{
thread_shared_struct m = getStuff();
return 0;
}


this code on godbolt

当然,这个例子没有多大意义,但它是从更大的代码库中对我的问题的最小复制。

使用 GCC(主干)和 Clang(主干),这很好用。

对于 MSVC (x64, 19.22),static_assert 失败并且 getStuff() 生成错误,因为它尝试返回与 C 调用约定不兼容的类型。

如果删除“volatile”,则一切正常。

MSVC 认为 thread_shared_struct 不是 POD 类型是错误的吗?

extern "C"部分位于需要保持原样的 C header 中。我怎么能从 C++ 中使用它?

最佳答案

来自 the Microsoft documentation :

When a class or struct is both trivial and standard-layout, it is a POD (Plain Old Data) type.



稍后描述文字类型,包括以下条件:

Additionally, all its non-static data members and base classes must be literal types and not volatile.



页面上的其他任何地方都没有提到“ volatile ”。

这一切都符合我们的发现 in the standard .

因此,我得出结论,这是一个编译器错误。

getStuff() generates an error because it attempts to return a type that is not compatible with the C calling convention.



实际上,这只是一个警告 (C4190),您可以根据需要禁用它。 x86_64 上的 Visual Studio 只有一种调用约定(描述为 here)。您的代码仍然可以正常工作。 VS 只是警告您,如果您实际尝试在 C 中使用它,该类型将不起作用。 extern "C"并不意味着编译为 C。

但是,确实收到此警告表明该错误确实存在于编译器中,而不仅仅是在 std::is_pod 的实现中。 .

另外,我建议避免使用 POD 术语和 std::is_pod新代码中的特征,因为它们是 deprecated from C++20 .

The extern "C" part is in a C header that needs to stay as is. How could I use it from C++?



任何实际上不需要类型符合 VS 的“POD”定义的东西,尽管有类型特征,都应该没问题。

关于c++ - 根据 MSVC,具有 volatile 成员的结构不再是 POD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59103157/

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