主要功能参数的属性

Posted

技术标签:

【中文标题】主要功能参数的属性【英文标题】:Attributes for main function parameters 【发布时间】:2020-10-25 10:45:15 【问题描述】:

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

Looks like 主函数只有 2 个支持的形式,没有 attribute-list,而一般的 function declaration syntax 确实有。

例子:

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

【问题讨论】:

Main function - cppreference.com 和 C++ Standard - 6.3.1 (latest draft) @DavidC.Rankin 是的,我确实在我的问题中提到了这个链接 添加了 C++ 标准草案。您不想使用作为程序入口点的main() 的参数,并且该功能受标准控制。你可能会打破比你修复它玩弄的更多的东西。是的,除了(int, char *[]) 之外的任何东西都将被实现定义。在独立环境(无操作系统)中,整个程序启动功能将由实现定义,甚至不需要命名为main() 属性不是参数/函数类型的一部分,所以应该没有区别 【参考方案1】:

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

但另一方面,如果您阅读 dcl.attr.unused#5,您将找不到任何特别的 main 内容,说明那里不允许这样做。

编译器必须知道此属性与 C++17 一致,但即使是未知属性也不会导致错误。你可以在标准中找到这个:

任何未被实现识别的属性标记都会被忽略。 dcl.attr#grammar-6

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

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

【讨论】:

另外:对于函数参数,您可以省略它们的名称 - 这是表示您仅在重载解析时才需要此参数的“旧方式”。你可以写 int main(int, char*[]) return 0; 【参考方案2】:

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

来自dcl.attr.grammar:

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

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

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

【讨论】:

我怀疑属性会影响类型吗? [[maybe_unused]] 说明符特别适用于特定变量的使用,而不是其类型。在所有情况下,我都看到属性更多地提示编译器如何进行翻译,而不影响语言规则或语义。 此外,就像其他答案所说的那样,标准要求该编译器忽略给定编译器不支持的属性。如果在这种情况下 [[maybe_unused]] 对编译器没有意义,则编译器应将其余部分保持不变。 属性不影响函数签名。它们只是对编译器的提示。 我不太明白。 “由于属性与参数有关......行为......不可移植”而是“......所以这个程序是可移植的”。这是否意味着[[maybe_unused]] 可以而其他人不行? @helloworld 是的,[[maybe_unused]] 行为已指定,这很好,但一般来说,一个属性可能会改变程序的行为。

以上是关于主要功能参数的属性的主要内容,如果未能解决你的问题,请参考以下文章

注解之@PathVariable

关于页面Meta属性

VUE项目实战45编写添加参数和添加属性的功能

VUE项目实战46完成参数的编辑和删除功能

可以看到LunaHangfireRunnerBase类的属性注入

VUE项目实战46完成参数的编辑和删除功能