主要功能参数的属性

Attributes for main function parameters

我可以对主要功能参数使用属性还是实现定义?

Looks like main function has only 2 supported forms without attribute-list while the general function declaration syntax 确实有。

示例:

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

Can I use attributes for main function parameters or is it implementation defined?

来自dcl.attr.grammar

For an attribute-token (including an attribute-scoped-token) not specified in this document, the behavior is implementation-defined.

由于属性属于参数,并且会影响 main 的声明,因此此类程序的行为是实现定义的,并且不能跨一致的实现移植。

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

确实没有明确要求主函数参数必须接受属性basic.start.main

但另一方面,如果您阅读 dcl.attr.unused#5,您找不到任何关于 main 的特殊内容,它表示那里不允许。

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

Any attribute-token that is not recognized by the implementation is ignored. dcl.attr#grammar-6

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

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