C99:从另一个 'main' 调用主函数?

C99: Call main function from another 'main'?

这个 question 有一个相似的标题,但我们正在讨论不同的事情。

说我想调用代码 foo.c

main
int main(){
   ...
}

问题是调用者是另一个main例程,而且似乎不可能有两个main函数。

如何从另一个main调用foo.c的主函数?

foo.c main 的名称无法更改,因为它不是 user-code。

and it seems impossible to have two 'main' functions.

同一对象(二进制、共享库)中不能有两个同名的符号...

在编译结束时,编译器将所有 objects files 合并到您的目标中,按名称解析符号。它无法区分您的两个 main 如果它们具有相同的名称。

重命名其中一个函数(不是程序真正入口点的函数)。

编辑:如果你从代码上摸不到对方的主名,编译后改一下。 gcc 示例:

gcc -o other_main.o -c other_main.c
objcopy --prefix-symbols=foo_ other_main.o
gcc -o yourbinary other_main.o main.c

然后,在您的 real main.

中调用 foo_main 而不是 main

一个程序不可能有两个main

How can I call foo.c's main function from another main? There is one constraint here. The name of the main in foo.c cannot be changed, because it is not a user-code.

一个程序中不能有两个 main 函数。

您不能从另一个函数调用 foo.c 的 main,因为就用户代码而言,main 是程序的起点。

只有通过两个不同的程序并从另一个使用 system or any of the exec*** 系列的程序执行包含 foo.c 的 main 的程序,才能实现您想要实现的目标函数。

你能做的最好的事情就是用“system('otherprog.exe arg1 arg2')"调用来调用另一个程序。也就是说,如果你不关心直接输出到标准输出的输出。

如果您想捕获第二个程序的输出,则需要使用更复杂的 popen() 调用打开管道。

FILE *fp;
int status;
char res[MAXLINE];


fp = popen("otherprog.exe param1 parm2", "r");
if (fp == NULL)
    /* Handle error */;

while (fgets(res, MAXLINE, fp) != NULL) {
    /* capture each stdout line from otherprog.exe */
    printf("do something with %s", res);
}

status = pclose(fp);

你不能使用两个主要的 functions.You 最好将函数名称从 'main' 更改为 foo.c 中的任何其他名称并调用 it.I 认为它不会改变你的程序的最终结果。

您可以像这样重命名 main() 函数:

objcopy --redefine-sym main=that_other_main obj1.o obj2.o

其中 obj.o 包含您不想成为程序主入口点的 main()。然后你可以用 that_other_main(argc, argv).

调用它

您描述的情况听起来是这样的:

/**
 * bar.c
 */
...
int main( void )
{
  ...
  // call foo.c's main function directly
  main( );
  ...
}

/**
 * foo.c
 */
int main( void )
{
  ...
}

你不能那样做。无法构建定义了两个 main 函数的程序。

所以问题就变成了,你到底想在这里做什么?

  1. bar.cfoo.c 是要内置到 相同的 可执行文件中,bar.c 中的代码调用 [=] 中定义的代码18=],同时仍允许将 foo.c 构建为独立程序?如果是这样,那么您将不得不将该代码从 foo.cmain 函数中取出,并将其放在一个单独的函数中,并且您将不得不使用一些预处理器魔法来抑制 foo.cmain 定义,当两个文件一起构建时,像这样:
    /**
     * bar.c
     */
    #include "foo.h"
    ...
    int main( void )
    {
      ...
      foo_func(); // function defined in foo.c
      ...
    }
    
    /**
     * foo.h
     */
    #ifndef FOO_H
    #define FOO_H
    
    void foo_func( void );
    #endif
    
    /**
     * foo.c
     */
    #include "foo.h"
    
    void foo_func( void )
    {
      ...
    }
    
    #ifndef EXTERNAL_DRIVER
    int main( void )
    {
      ...
      foo_func();
      ...
    }
    #endif
    
    这允许将 `foo` 构建为独立程序,以及更大程序的一部分。要将其构建为更大程序的一部分,您必须定义“EXTERNAL_DRIVER”宏,如下所示:
    gcc -o bar bar.c foo.c -DEXTERNAL_DRIVER
    
  2. bar.cfoo.c 是要构建到两个单独的可执行文件中,并让 运行 bar 实例启动一个新的 foo 实例,然后在继续之前等待 foo 实例完成 运行?如果是这样,那么您可以使用 C 标准库的 system 函数从 bar 调用 foo
    system("foo");
    
    尽管您可能必须将路径指定为命令的一部分,例如
    system("./foo")
    
    要么
    system("/some/absolute/path/name/foo");
    
    如果你在 *nix 系统上,你可以使用 forkexec* 函数之一的组合来做同样的事情,除了 bar 实例不等待foo完成执行。 如果您希望两个程序在 运行 时共享数据,那么您将不得不研究各种进程间通信技术(共享内存、套接字、管道等)。
  3. bar.cfoo.c 是否意味着要内置到两个单独的可执行文件中,并且在 运行 foo 中定义了一个 运行 bar 实例执行代码实例?那是一个远程过程调用,我在过去 20 年里可能做过一次,就像进程间通信一样,有点涉及 SO 答案。

如果我没有涵盖您的特定用例,请告诉我。