c语言 - C99:从另一个"main"调用主函数?



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

假设我想调用代码 foo.c 的main

int main(){
   ...
}

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

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

foo.c 中main的名称无法更改,因为它不是用户代码。

而且似乎不可能有两个"主要"功能。

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

在编译结束时,编译器将所有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

然后,拨打foo_main而不是main您的真实main

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

/**
 * 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调用代码在 foo.c 中定义,同时仍然允许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 系统,则可以结合使用 fork 和其中一个exec*函数来执行大致相同的操作,只是bar实例不必等待foo完成执行。 如果您希望两个程序在运行时共享数据,则必须研究各种进程间通信技术(共享内存,套接字,管道等(。
  3. .bar.cfoo.c 是否意味着构建到两个单独的可执行文件中,并在正在运行的 foo 实例中定义正在运行的bar实例执行代码? 这是一个远程过程调用,我在过去 20 年中可能做过一次,并且与进程间通信一样,对于 SO 答案有点复杂。

如果我还没有介绍您的特定用例,请告诉我。

您可以

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

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

其中obj.o包含您不希望成为程序主要入口点的main()。然后,您可以使用 that_other_main(argc, argv) 调用它。

如何从另一个main调用 foo.c 的main函数?这里有一个约束。foo.c 中的 main 名称无法更改,因为它不是用户代码。

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

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

只有通过拥有两个不同的程序并使用system或任何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);

在一个程序中不可能有两个主的

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

相关内容

  • 没有找到相关文章

最新更新