0

我正在为一个项目使用最近 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
4

1 回答 1

1

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

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

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

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

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

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

我不知道自发布以来是否有任何变化,但至少还有一个关于缺乏对该功能的支持的错误报告,该功能已被推迟关闭(意思是,大概尚未修复)。因此,可能导致您出现问题的原因。


而且,根据您的评论,只有 Intellisense 抱怨对齐,我相信这个错误报告中已经涵盖了这一点:

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

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

于 2013-08-07T07:45:58.340 回答