[英]C99: Call main function from another '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
然后,在真正的main
中調用foo_main
而不是main
。
您可以像這樣重命名main()
函數:
objcopy --redefine-sym main=that_other_main obj1.o obj2.o
obj.o
包含main()
,您不希望它成為程序的主要入口點。 然后,您可以使用that_other_main(argc, argv)
調用它。
您可以做的最好的事情是使用“ 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);
您描述的情況聽起來像這樣:
/**
* 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
定義。文件是一起構建的,如下所示: /** * 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答案。 如果我沒有涵蓋您的特定用例,請告訴我。
你不能使用兩個主要功能。你最好將功能名稱從'main'更改為foo.c中的任何其他功能並調用它。我認為它不會改變程序的最終結果。
在一個程序中不可能有兩個主要部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.