这个问题有一个相似的标题,但我们讨论的是不同的事情。
假设我想调用代码 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
函数的程序。
所以问题就变成了,你在这里真正想做什么?
bar.c
和foo.c
是否意味着内置到同一个可执行文件中,代码bar.c
调用代码在foo.c
中定义,同时仍然允许foo.c
作为独立程序构建? 如果是这样,那么你必须从foo.c
的main
函数中取出该代码并将其放在一个单独的函数中,并且当两个文件一起构建时,您必须使用一些预处理器魔法来抑制foo.c
的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
gcc -o bar bar.c foo.c -DEXTERNAL_DRIVER
-
bar.c
和foo.c
是否意味着构建到两个单独的可执行文件中,并让正在运行的bar
实例启动新的foo
实例,然后等待foo
实例完成运行再继续? 如果是这样,那么您可以使用 C 标准库的system
函数从bar
调用foo
:
尽管您可能必须将路径指定为命令的一部分,例如system("foo");
或system("./foo")
如果您使用的是 *nix 系统,则可以结合使用system("/some/absolute/path/name/foo");
fork
和其中一个exec*
函数来执行大致相同的操作,只是bar
实例不必等待foo
完成执行。 如果您希望两个程序在运行时共享数据,则必须研究各种进程间通信技术(共享内存,套接字,管道等(。 - .
bar.c
和foo.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"更改为任何其他函数名称并调用它。我认为这不会改变您的程序的最终结果。