gpt4 book ai didi

c++ - 警告 C5029 是否仅指示正在使用 Microsoft 扩展?

转载 作者:行者123 更新时间:2023-11-30 03:49:16 25 4
gpt4 key购买 nike

我们正在评估升级到 VS2015,并在结构定义中使用 __declspec(align(16)) 时收到警告 C5029。这个警告显然是 VS 2015 的新警告,因为我们在 VS 2013 中使用了相同的代码而没有警告。下面是一个例子...

typedef __declspec(align(16)) struct tag_RECTF
{
union
{
__m128 Rect;

struct
{
float left;
float top;
float right;
float bottom;
};
};

} RECTF;

发出的警告是:

C:\path\header.h(81): warning C5029: nonstandard extension used: alignment attributes in C++ apply to variables, data members and tag types only

我发现,如果我颠倒 typedef 行上 __declspec(align(16))struct 的顺序,则可以避免警告。问题是,Microsoft 文档建议使用我上面列出的顺序(这会导致警告)。

据我所知,对齐是通过相反的顺序强制执行的,但我想确保这是避免警告的正确解决方法。

网上关于 C5029 的信息少得可怜(甚至在 Microsoft 文档中也没有)。

您对此有什么建议/见解吗?

提前致谢。

-诺埃尔

最佳答案

警告的意思是标准 C++ 不允许您使用 typedef 创建具有不同对齐方式的新类型。在这种情况下,警告是虚假的,因为您正在使用 __declspec(align()) 您的代码无论如何都不符合 C++ 标准。

您的示例代码实际上定义了两种类型。第一种类型是 tag_RECTF 并具有默认对齐方式。第二种类型是 RECTF 并具有 16 字节对齐。当您将 __declspec(align(16))struct 交换时,您最终只会定义一种类型。在这种情况下,RECTF 只是 tag_RECTF 的别名,它们是同一类型。

换句话说,您的示例代码等效于这两个声明:

 struct tag_RECTF {...};
typedef __declspec(align(16)) tag_RECTF RECTF;

如果您交换 __declspecstruct 那么您的示例将等效于以下内容:

 struct __declspec(aligned(16)) tag_RECTF {...};
typedef tag_RECTF RECTF;

如果你把上面两个例子中的__declspec(align(16))替换成alignas(16),那么上面的第一个例子是不符合的,而第二个例子是符合的。

由于 Microsoft 的 __declspec(align())typedef 一起工作,您可以根据需要保留代码原样,而忽略编译器发出的虚假警告.如果您希望您的代码符合要求,那么您应该使用 alignas(16) 并将其放在 struct 关键字之后。由于您可能希望 tag_RECTFRECTF 具有相同的对齐方式,因此我建议您稍后进行。

关于c++ - 警告 C5029 是否仅指示正在使用 Microsoft 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32671271/

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