【问题标题】:Can I safely use functions containing "main" in their name besides "int main(int argc, char **argv)"?除了“int main(int argc, char **argv)”之外,我可以安全地使用名称中包含“main”的函数吗?
【发布时间】:2022-01-04 10:56:29
【问题描述】:

最近我遇到了this micro article,其中声明了以下内容:

  1. 在您的 C 程序中,您只能有一个“main”函数,无论它是否称为“main”。如果您使用 IPA,当检测到多个“主要”功能时,IPA 将终止并发出错误消息。

我是否正确理解 main 名称(或其他一些明确定义为替代入口点的 int main() 的名称)是一个重要部分,例如,我可以使用 int main(int argc, char **argv)int sub_main(int argc, char **argv) 在同一个程序中?

如果没有,并且如果函数名称中有main 和/或(int argc, char **argv) 作为参数我可能会遇到问题,将参数的位置更改为int sub_main(char **argv, int argc) 会有什么不同吗?

到目前为止,我还没有遇到任何问题,因此假设 int main(int argc, char **argv)int sub_main(int argc, char **argv) 可以愉快地共存。不过,肯定会很方便。

【问题讨论】:

  • 基本上:使用编译器文档告诉您使用的形式。 main() 的形式由编译器决定,而不是由程序员决定。

标签: c main


【解决方案1】:

根据 C 标准,您的代码中必须有一个且只有一个 main 函数,这是执行开始的地方。 C 定义了以下声明

  • int main(void)
  • int main(int, char **)(或等价物,例如 char *argv[]

也可能有(与any C 函数一样,只有一个定义,在所有文件中(但可能有任意数量的声明)。 p>

sub_main() 或任何其他不完全正确 main() 的变体是完全合法的。函数的名称和类型是不同的 - 名称是唯一的,类型不必是唯一的。

所以对于void fn(void);fn 是“名称”(也称为“标识符”),而void (void) 是类型(不带参数且不返回任何内容的函数)。

当您想确切知道时,请务必询问其他人,就像您在此处所做的那样,但也请务必将人们的答案与重要的 C 标准相关联。

【讨论】:

  • @SergeBallesta int main() 可能工作(在某些 [大多数?] 实现中......),但 IMO 根据 C11 5.1.2.2.1 Program startup, paragraph 1 无效,它仅列出 @987654332 @、int main(int argc, char *argv[]) 和“其他一些实现定义的方式”。我看不出为什么int main(void)int main() 在任何实现中都必须具有相同的调用约定,我想说int main() 事实上 是一个可变参数函数,而int main(void) 明确没有参数.它们不必相等。
  • @user426: () 仅在不是定义的函数声明中表示任意数量的未知参数。在函数定义中,必然伴随一个空的declaration-list(来自C 2018 6.9.1 1中的语法),并且函数被定义为没有参数。
  • @AndrewHenle: C 2018 5.1.2.2.1 1 没有说main 必须仅声明为int main(void)int main(int argc, char *argv[]) 或其他一些实现定义的方式。它还允许等效定义。在函数定义中,int main() { … } 将函数定义为不使用参数,因为它的 declaration-list(在() 之后和{ 之前)是空的,因此它等同于 @987654345 @。 (请注意,需要这种等效性,以便旧的源代码在新的 C 标准下继续有效。)
  • @AndrewHenle: C 2018 6.7.6.3 15 说“……如果一种类型有一个参数类型列表 [int main(void) 有] 而另一种类型由函数定义指定 [int main() { … } is] 包含一个(可能为空的)标识符列表 [int main() 确实],两者都应在参数数量上达成一致 [均为零],并且每个原型参数的类型应与应用程序产生的类型兼容的默认参数提升到相应标识符的类型[由于没有参数而很容易满足]。“所以类型是兼容的。
  • ...Eric 是我刚才注意到的 FGITW。
【解决方案2】:

只有函数“main”的确切名称对编译器了解程序从哪里开始很重要。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2014-10-09
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多