这个question有类似的标题,但我们正在讨论不同的事情。
说我想调用代码foo.c的main
int main(){
...
}
问题是调用者是另一个main
例程,似乎不可能有两个main
函数。
如何从另一个foo.c
拨打main
的主要功能?
foo.c 中main
的名称无法更改,因为它不是用户代码。
答案 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
函数的程序。
所以问题就变成了,你在这里真正想做什么?
bar.c
和foo.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
gcc -o bar bar.c foo.c -DEXTERNAL_DRIVER
和bar.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
完成执行。
如果您希望两个程序在运行时共享数据,那么您将不得不研究各种进程间通信技术(共享内存,套接字,管道等)。
foo
和bar.c
是否构建在两个单独的可执行文件中,并且在正在运行的foo.c
实例中定义了正在运行的bar
实例执行代码?这是一个远程过程调用,我在过去的20年中曾经做过一次,并且像进程间通信一样,有点涉及SO答案。
如果我没有覆盖您的特定用例,请告诉我们。
答案 5 :(得分:0)
你无法使用两个主要功能。你最好将功能名称从'main'更改为foo.c中的任何其他功能并调用它。我认为它不会改变程序的最终结果。
答案 6 :(得分:-1)
在一个程序中不可能有两个主要部分