【问题标题】:IntelliSense: Invalid alignment specifier valueIntelliSense:对齐说明符值无效
【发布时间】:2013-08-07 07:37:54
【问题描述】:

我正在为一个项目使用最近 1.5.2 版本的 POCO C++ 库,每次编译我的项目时,我都会在 POCO 代码中收到上述“错误”。我说“错误”是因为它们显示为错误,但它们不会阻止我编译、链接或执行我的项目。

错误出现在“Foundation/include/poco/alignment.h”中:

POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(512);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1024);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2048);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4096);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8192);

较低的值(16、32、64、128)不会产生错误。

我有两个问题:

  1. 上面的代码到底想做什么?
  2. 为什么它们会产生错误,我该如何消除它们?

我正在使用 buildwin.cmd 构建 POCO,配置如下:

VS_VERSION 100
ACTION build
LINKMODE static_mt
CONFIGURATION both
PLATFORM Win32

【问题讨论】:

    标签: visual-c++ poco-libraries


    【解决方案1】:

    如果没有看到实际的“错误”,有点难以看到(如果编译成功,它们不是编译器错误,但见下文),但宏是这样定义的:

    #define POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
        template <> struct AlignedCharArrayImpl<x> \
        { \
            char aligned alignas(x); \
        }
        #define POCO_HAVE_ALIGNMENT
    #endif
    

    换句话说,它尝试创建一些模板对齐结构定义,例如AlignedCharArrayImpl&lt;16&gt;AlignedCharArrayImpl&lt;8192&gt;。该错误可能是由于将无效对齐传递给alignas,基于您的标题Invalid alignment specifier value

    但是,在这种情况下,您的代码实际上不应编译,因为 C++11 7.6.2 明确指出不受支持的对齐会使程序格式错误。由于没有看到实际的错误消息,我无法在特定方面提供帮助。

    我对 Microsoft C++ 产品的经验也很少(我主要使用 C#),但this page 似乎表明对alignas 的支持“不太完整”:

    Visual C++ 2010 和 Visual Studio 2012 中的 Visual C++ 均未实现工作文件中投票的对齐提案中的核心语言关键字 alignas/alignof。 Visual C++ 2010 有来自 TR1 的对齐存储。 Visual Studio 2012 中的 Visual C++ 将aligned_union 和std::align() 添加到标准库中。

    我不知道自发布以来是否有任何变化,但至少还有 one bug report 对此功能缺乏支持,该功能已被推迟关闭(意思是,大概尚未修复)。所以可能是那个导致了你的问题。


    并且,根据您的评论,只有 Intellisense 抱怨对齐,我相信 this bug report 中已经涵盖了这一点:

    我们为 IntelliSense 和构建使用单独的编译器,不幸的是,它们在对齐的上限上存在分歧。

    换句话说,只要您的编译器正在编译它,您就可以放心地忽略 Intellisense 错误。显然,微软对 IDE 的定义并不像我们所期望的那样“集成”:-)

    【讨论】:

    • 有趣的是,实际的错误消息实际上只是“智能感知:无效对齐说明符值”,这似乎表明它是某种 IDE“错误”而不是构建/编译器错误.编译器构建输出不会产生与这些错误相关的任何内容。
    • @pbergqvist,查看更新,Intellisense 和编译器不一定就对齐的上限达成一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多