8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么在使用 clang 的静态声明中使用 alignas 时无法编译?

user1717828 1月前

45 0

我在 clang 上遇到编译错误,并且在 gcc 中使用以下代码时出现警告:static alignas(16) int one_s = 1; // clang: error: an attribute list could not appeared here; gcc: warning:

我在 clang 上遇到编译错误,并在 gcc 上使用以下代码时遇到警告:

static alignas(16) int one_s = 1;                      // clang: error: an attribute list cannot appear here; gcc: warning: attribute ignored;
static __attribute__((aligned(16))) int zero_s = 0;    // on the other hand this works well on both compilers...
alignas(16) int one = 1;                               // this also works on both compilers
__attribute__((aligned(16))) int zero = 0;             // as well as this

有人知道为什么在包含 static 关键字的声明中不接受 alignas 吗?我在 gcc 和 clang 中都使用了 --std=c++11 编译器选项。(编辑:我使用了 clang 3.4 及以上版本和 gcc 4.8 及以上版本)

请注意,当使用 Visual Studio(CL 19 RC)进行编译时,在这样的静态声明中使用 alignas 不会出现错误。

帖子版权声明 1、本帖标题:为什么在使用 clang 的静态声明中使用 alignas 时无法编译?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user1717828在本站《arrays》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @Paul RI 看到这确实可以编译,但 VS 也接受其他版本,即使使用 /Wall。在 static 之前使用 alignas(16) 的语法是否正确(根据标准)?

  • 我不太懂语言律师,否则我可能会扩展上述评论并做出答案,但如果你采取务实的态度,在谷歌上搜索 alignas,你会发现所有的例子都

  • static alignas(16) int one_s = 1; 根据 简单声明 simple-declaration :

     simple-declaration:
       decl-specifier-seq init-declarator-listopt ;  <--------this is the case here
       attribute-specifier-seq decl-specifier-seq init-declarator-list ;
       attribute-specifier-seqopt decl-specifier-seq ref-qualifieropt [ identifier-list ] initializer ; 
    

    接下来我们讨论 decl-specifier-seq :

    decl-specifier-seq:
       decl-specifier attribute-specifier-seqopt   //this doesn't match
       decl-specifier decl-specifier-seq           //this doesn't match either
    

    现在,上述两条规则都不允许 static alignas(16) int .


    解决方案

    正确的语法是:

    alignas(16) static int one_s = 1;
    

    这一次,语法允许这样做。

    simple-declaration:
       decl-specifier-seq init-declarator-listopt ;
       attribute-specifier-seq decl-specifier-seq init-declarator-list ; //this is used now
       ^^^^^^^^alignas^^^^^^^^
    

    接下来我们进入:

     decl-specifier-seq:
       decl-specifier attribute-specifier-seqopt
       decl-specifier decl-specifier-seq      <--------this is used here
       ^^^^static^^^^
    

    这是 msvc 错误: MSVC 接受具有静态 alignas(16) int one_s = 1 的无效程序;

  • 因此 tl;dr alignas(...) 本质上是 [[attribute]] 的一种形式。

  • 我可能误解了:decl-specifier 可以是 storage-class-specifier,而 static 是 alignas,它形成一个 attribute-specifier-seq,因此 decl-specifier-seq 是匹配的?我的推理有什么问题?

  • @Oersted 注意第一种情况下 alignas(16) 后面的 int。这就是问题所在。换句话说,static alignas(16) 没问题,但其旁边的 int 不行。它不会进入 init-declarator-listopt

  • 按照这种推理,将 alignas 推到最后也是有效的? static int one_s alignas(16) = 1; 这里

  • @Oersted 您的示例 static int one_s alignas(16) = 1; 也因语法而看起来无效。而 static int alignas(16) one_s = 1; 似乎根据语法有效。但只有 msvc 接受它

返回
作者最近主题: