簡體   English   中英

C99:從另一個'main'調用main函數?

[英]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)調用它。

如何從另一個main調用foo.c的main功能? 這里有一個約束。 foo.c中main的名稱無法更改,因為它不是用戶代碼。

程序中不能有兩個main功能。

你不能從另一個函數調用foo.c的main ,因為就用戶代碼而言main是程序的起點。

你所要完成的,只能由具有兩個不同的程序和執行包含的程序來實現main使用的foo.c從其他程序system或任何的exec***系列函數。

您可以做的最好的事情是使用“ 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功能的程序。

所以問題就變成了,你真的想在這做什么?

  1. bar.cfoo.c是否構建在同一個可執行文件中, bar.c代碼調用foo.c定義的代碼,同時仍允許將foo.c構建為獨立程序? 如果是這樣,那么你將不得不從foo.cmain函數中取出該代碼並將其放在一個單獨的函數中,並且你必須使用一些預處理器魔法來抑制foo.cmain定義。文件是一起構建的,如下所示:
     /** * 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 
  2. bar.cfoo.c是否構建在兩個獨立的可執行文件中,並且有一個運行的bar實例啟動一個新的foo實例,然后在繼續之前等待foo實例完成運行? 如果是這樣,那么你可以使用C標准庫的system函數從bar調用foo
     system("foo"); 
    雖然您可能必須將路徑指定為命令的一部分,例如
     system("./foo") 
    要么
     system("/some/absolute/path/name/foo"); 
    如果你是一個* nix的系統上,你可以使用的組合fork和一個exec*功能做同樣的事情,除了bar實例沒有等待foo執行完畢。 如果您希望兩個程序在運行時共享數據,那么您將不得不研究各種進程間通信技術(共享內存,套接字,管道等)。
  3. bar.cfoo.c是否構建在兩個獨立的可執行文件中,並且在正在運行的foo實例中定義了一個運行bar實例執行代碼? 這是一個遠程過程調用,我在過去的20年中曾經做過一次,就像進程間通信一樣,有點涉及SO答案。

如果我沒有涵蓋您的特定用例,請告訴我。

你不能使用兩個主要功能。你最好將功能名稱從'main'更改為foo.c中的任何其他功能並調用它。我認為它不會改變程序的最終結果。

在一個程序中不可能有兩個主要部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM