【问题标题】:Two 'main' functions in C/C++C/C++ 中的两个“主要”函数
【发布时间】:2010-01-02 08:00:13
【问题描述】:

我可以用 C 或 C++ 编写具有两个主要功能的程序吗?

【问题讨论】:

  • 您希望他们做什么?应该调用哪一个?
  • 套用孔子的话,千里之行始于一个入口。你不能有两个 main()s。
  • 不知道是否相关,但某些程序(例如busybox)有一个 main() 实现,它检查 argv[0] 的值,然后调用相关的 something_else_main() 函数,具体取决于 argv [0] 的值。这样,您可以根据文件名以完全不同的方式拥有单个可执行文件。与符号链接一起使用,这可以节省磁盘空间,因为不需要在多个可执行文件中复制共享代码。 (共享库也可以做同样的事情,但维护起来比较麻烦)
  • @JeremyFriesner, int main(int argc, char **argv) { int (*start)(int, char **); if (strcmp(argv[0], "file_name1") == 0) start = start_file_name1; else if (strcmp(argv[0], "file_name2") == 0) start = start_file_name2; /* etc */ else start = start_other; return start(argc, argv); } 你想要两个mains 有什么问题?另外,有两个 main 如何使可执行文件根据文件名选择调用哪一个?
  • @Shahbaz 我可以看到该代码没有任何问题,尽管函数指针的使用并非绝对必要 - 即您可以只调用 start_file_name1(argc,argv) [等] 如果您愿意,可以直接从 if-then 子句中获取。至于有两个 main(),你真的不能这样做,因为你会得到一个链接错误(重复的函数名称)。但是你可以有几个类似于 main() 但调用别的函数的函数,而 main() 调用它们(就像在你的例子中一样)。

标签: c++ c


【解决方案1】:

没有。所有程序都有一个 main(),这就是编译器和链接器生成可执行文件的方式,该可执行文件从合理的地方开始。

你基本上有两种选择:

  1. 让 main() 解释一些命令行参数来决定调用什么实际的 main。缺点是您将拥有两个程序的可执行文件。

  2. 从共享代码中创建一个库,并针对该库编译每个主文件。你最终会得到两个可执行文件。

【讨论】:

  • 这个geeksforgeeks.org/output-of-a-program-set-2 int main() { static int i=5; 怎么样? if(--i){ main(); printf("%d",i); } }
  • 这个答案不正确。虽然main 的定义可能只有一个带有外部链接的定义,但C 标准并没有明确禁止带有内部链接的附加定义(用static 声明)。至少带有 clang-1000.11.45.5 的 Apple LLVM 10.0.0 接受了这一点并生成了一个可执行文件,尽管有一个警告。
【解决方案2】:

您可以有两个称为main 的函数。 name 没有任何特殊性,也没有保留。比较特别的是 function,它恰好有这个名字。该函数是全局的。因此,如果您在其他命名空间中编写 main 函数,您将拥有第二个 main 函数。

namespace kuppusamy {
  int main() { return 0; } 
}

int main() { kuppusamy::main(); }

第一个 main 函数并不特殊 - 请注意您必须如何明确地 return

【讨论】:

  • 你不需要在'真正的' main() 中显式返回吗?现在还没有定义你发布的程序将返回什么结果代码(AFAIK)
  • 不,真正的main()不需要返回值,默认为0。
  • Chinmay:准确地说,::main 不需要返回 statement,它默认为 return 0;return; 无效)。并且返回类型必须保持 int 无论如何。除了指出 ::main 的特殊性之外,以任何方式使用它都是可疑的,YMMV。
  • 这个名字真的很特别和保留,但它是::main而不是main(就像::_a是保留但ns::_a不是),我不确定OP真的明白他可以做出这种区分,更不用说他应该做的了。
  • @Roger,并注意您可以在全局命名空间中声明 struct main { };,我认为 - 反驳 ::main 将是为主要功能保留的名称的说法:)跨度>
【解决方案3】:

是的;但是,它是 platform specific 而不是标准 C,如果您询问您真正想要实现的目标(而不是尝试解决该问题),那么您可能会收到对您更有帮助的答案。

【讨论】:

  • “弱符号”的链接并不真正支持您的断言,最终程序仍然只有一个 main() 函数的入口点。具体的主要符号将简单地覆盖弱符号。
  • "我可以用 C 或 C++ 编写具有两个主要功能的程序吗?"是的,源代码,即 C/C++ 程序,将有两个主要功能。编译后的版本,即机器码程序,仍然有两个主要功能。实际在计算机上运行的链接版本只有一个。然而,我回答的真正意义在于他问错了问题,而答案几乎可以肯定没关系,而他应该做的是问一个不同的问题。
【解决方案4】:

不,一个程序只能有 1 个入口点(即main())。事实上,更一般地说,你只能在 C 中拥有一个给定名称的函数。

【讨论】:

    【解决方案5】:

    如果一个是 static 并且驻留在不同的源文件中,我看不出有任何问题。

    【讨论】:

      【解决方案6】:

      main() 定义了程序的入口点,您的程序中必须只有一个 main() 函数(入口点)。

      坦率地说,你的问题对我来说没有多大意义。

      【讨论】:

      • 我相信这个问题是完全合理的。人们只是想知道为什么会这样。
      【解决方案7】:

      “主要功能”是什么意思?如果您的意思是程序启动时执行的第一个函数,那么您只能有一个。 (你只能先拥有一个!)

      如果您想让您的应用程序在启动时执行不同的操作,您可以编写一个 main 函数来读取命令行(例如),然后决定调用哪个其他函数。

      【讨论】:

        【解决方案8】:

        在一些非常特殊的架构中,你可以。 Cell Processor 就是这种情况,您有一个用于主处理器的主程序(称为 PPE 的 64 位 PowerPC 处理器元素)和用于 8 个不同协处理器(称为 32 位协同处理元素)的一个或多个主程序SPE)。

        【讨论】:

        • 那不是只有九个独立的程序,而不是一个有九个入口点的程序吗!?
        • 你说的是真的,但是将 SPE 表示为“物理线程”会更准确,其中 SPE 主函数将是线程的入口点。 (这将成为多进程多线程辩论^^)
        【解决方案9】:

        不,C 语言中的 main() 函数不能超过一个。在标准 C 语言中,main() 函数是一个特殊函数,被定义为程序的入口点。您用 C 语言或任何其他语言创建的任何函数的副本不能超过一个 - 除非您指定不同的签名。但在 main() 的情况下,我认为你别无选择 ;)

        【讨论】:

          【解决方案10】:

          不,main() 是程序的入口点,因为你不能有两个入口点,所以你不能有两个 main()。

          【讨论】:

            【解决方案11】:

            您可以编写它,它会编译,但它不会链接(除非您的链接器不符合标准)

            【讨论】:

              【解决方案12】:

              习惯用法是根据argv[0] 的值进行调度。使用硬链接 (POSIX),您甚至不会丢失磁盘空间。

              【讨论】:

                【解决方案13】:

                标准 C 不允许嵌套函数,但 GCC 允许。

                void main()
                
                {
                
                void main()
                
                {
                
                printf(“stackoverflow”);
                
                }
                
                printf(“hii”);
                
                }
                

                此代码的 o/p 将是 -hii

                如果你使用 GCC 编译器。

                如果你想在你的程序中使用 2 main() 有一个简单的技巧可以成功执行;你可以使用define.Example-

                void main()
                
                {
                
                printf("In 1st main\n");
                
                func1();
                
                }
                
                #define main func1
                
                void main()
                
                {
                
                printf("In 2nd main\n");
                
                }
                

                这里的 o/p 将是:

                在第一主线

                在第二主线

                注意:此处将生成 func1 类型冲突的警告。

                是的,不要更改定义的位置。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-31
                  • 1970-01-01
                  • 2020-03-26
                  • 1970-01-01
                  • 2020-07-11
                  • 2018-11-02
                  • 2016-07-22
                  相关资源
                  最近更新 更多