主要功能参数的属性
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?
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。所以我会说没关系。
但是因为它允许有一个不带参数的主函数,所以我更喜欢它。
我可以对主要功能参数使用属性还是实现定义?
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?
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。所以我会说没关系。 但是因为它允许有一个不带参数的主函数,所以我更喜欢它。