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
函数的程序。
所以问题就变成了,你到底想在这里做什么?
bar.c
和 foo.c
是要内置到 相同的 可执行文件中,bar.c
中的代码调用 [=] 中定义的代码18=],同时仍允许将 foo.c
构建为独立程序?如果是这样,那么您将不得不将该代码从 foo.c
的 main
函数中取出,并将其放在一个单独的函数中,并且您将不得不使用一些预处理器魔法来抑制 foo.c
的 main
定义,当两个文件一起构建时,像这样:
/**
* 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
-
bar.c
和 foo.c
是要构建到两个单独的可执行文件中,并让 运行 bar
实例启动一个新的 foo
实例,然后在继续之前等待 foo
实例完成 运行?如果是这样,那么您可以使用 C 标准库的 system
函数从 bar
调用 foo
:
system("foo");
尽管您可能必须将路径指定为命令的一部分,例如
system("./foo")
要么
system("/some/absolute/path/name/foo");
如果你在 *nix 系统上,你可以使用 fork
和 exec*
函数之一的组合来做同样的事情,除了 bar
实例不有等待foo
完成执行。
如果您希望两个程序在 运行 时共享数据,那么您将不得不研究各种进程间通信技术(共享内存、套接字、管道等)。
- 。
bar.c
和 foo.c
是否意味着要内置到两个单独的可执行文件中,并且在 运行 foo
中定义了一个 运行 bar
实例执行代码实例?那是一个远程过程调用,我在过去 20 年里可能做过一次,就像进程间通信一样,有点涉及 SO 答案。
如果我没有涵盖您的特定用例,请告诉我。
这个 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 anothermain
? 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
函数的程序。
所以问题就变成了,你到底想在这里做什么?
bar.c
和foo.c
是要内置到 相同的 可执行文件中,bar.c
中的代码调用 [=] 中定义的代码18=],同时仍允许将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 答案。
如果我没有涵盖您的特定用例,请告诉我。