主函数参数的属性

Attributes for main function parameters

本文关键字:属性 参数 函数      更新时间:2023-10-16

我可以将属性用于主函数参数还是定义实现?

看起来 main 函数只有 2 个受支持的表单没有属性列表,而通用函数声明语法确实有它。

例:

int main([[maybe_unused]] int argc, char* argv[]);

事实上,对于主函数参数 basic.start.main 必须接受属性,并没有明确要求

。但另一方面,如果你阅读dcl.attr.unused#5,你找不到任何特别的main,它说那里是不允许的。

编译器必须知道此属性符合 C++17,但即使是未知属性也不应导致错误。您可以在标准中找到以下内容:

实现无法识别的任何属性令牌都将被忽略。 dcl.attr#grammar-6

不幸的是,属性有时会导致错误(即使它们不应该(。请参阅此问题:GSL_SUPPRESS。

在实践中,您的代码被所有主要编译器接受,而不会发出警告。因此,我会说没关系。 但是因为它被允许有一个不需要参数的主函数,所以我更喜欢它。

我可以将属性用于主函数参数还是定义实现?

来自dcl.attr.grammar:

对于本文档中未指定的属性令牌(包括属性范围的令牌(,该行为是实现定义的。

由于该属性与参数有关,并且会影响main的声明,因此此类程序的行为是实现定义的,并且不能在符合的实现中移植。

对于您的[[maybe_unused]]示例,此属性在 dcl.attr.unused 中指定。似乎没有措辞表明此属性会影响变量声明的类型,或者对程序的行为具有任何其他语义影响,因此该程序是可移植的。