C99:从另一个'主要呼叫主要功能'?

时间:2015-07-20 14:43:06

标签: c main

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

说我想调用代码foo.c的main

int main(){
   ...
}

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

如何从另一个foo.c拨打main的主要功能?

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

7 个答案:

答案 0 :(得分:7)

  

似乎不可能有两个'主要'功能。

在同一个对象(二进制,共享库)中不能有两个具有相同名称的符号......

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

  

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

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

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

您要完成的任务只能通过两个不同的程序并使用system或任何{{{}来执行包含来自其他程序的main foo.c的程序来实现。 3}}函数族。

答案 3 :(得分:2)

你可以做的最好的事情就是用“system('otherprog.exe arg1 arg2')"调用来调用另一个程序。那就是你不关心直接输出到stdout的输出。

如果你想捕获第二个程序的输出而不是你需要打开一个更复杂的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);

答案 4 :(得分:2)

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

/**
 * 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.c main函数中取出该代码并将其放在单独的函数中,并且您必须使用某些代码当两个文件一起构建时,预处理器魔术可以抑制foo.c的{​​{1}}定义,如下所示:
    main
    这允许将`foo`构建为独立程序,以及更大程序的一部分。要将它构建为更大程序的一部分,必须定义`EXTERNAL_DRIVER`宏,如下所示:
    /**
     * 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
    
  2. gcc -o bar bar.c foo.c -DEXTERNAL_DRIVERbar.c是否构建在两个独立的可执行文件中,并且有一个正在运行的foo.c实例启动一个新的bar实例,然后等待让foo实例在继续之前完成运行?如果是,那么您可以使用C标准库的foo函数从system调用foo
    bar
    虽然您可能必须将路径指定为命令的一部分,例如
    system("foo");
    要么
    system("./foo")
    如果您使用的是* nix系统,则可以使用system("/some/absolute/path/name/foo");和其中一个fork函数的组合执行相同的操作,但exec*实例不会#39; t 等待bar完成执行。 如果您希望两个程序在运行时共享数据,那么您将不得不研究各种进程间通信技术(共享内存,套接字,管道等)。
  3. foobar.c是否构建在两个单独的可执行文件中,并且在正在运行的foo.c实例中定义了正在运行的bar实例执行代码?这是一个远程过程调用,我在过去的20年中曾经做过一次,并且像进程间通信一样,有点涉及SO答案。

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

在一个程序中不可能有两个主要部分