程式分身:根據不同程式名執行不同函式
阿新 • • 發佈:2019-01-09
背景
最近在看某開源專案原始碼,發現程式碼裡對main函式的引數做了處理,根據傳入的程式名稱(即argv[0]),呼叫不同的函式。筆者認為這個小技巧挺不錯的,本文就整理實踐一下。
完整原始碼
main.c原始碼如下:
/**
作用:
只有可執行程式檔名是foo或bar時才能正常執行,其它任何字串都不行。
作用:
如有服務端、客戶端的小程式,可在一個檔案中實現,編譯,然後改名,根據可執行檔案不同,呼叫不同函式,達到“多程式”目的。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int foo_1(int argc, char* argv[])
{
printf("hello foo.\n");
}
int bar_1(int argc, char* argv[])
{
printf("hello bar.\n");
}
#define CMD_FOO "foo"
#define CMD_BAR "bar"
int main(int argc, char *argv[])
{
char * p;
char* cmdname = *argv;
if ((p = strrchr (cmdname, '/')) != NULL) {
cmdname = p + 1;
}
if (strcmp(cmdname, CMD_FOO) == 0) {
if (foo_1 (argc, argv) != 0)
return -1;
return 0;
} else if (strcmp(cmdname, CMD_BAR) == 0) {
if (bar_1 (argc, argv) != 0 )
return -1;
return 0;
}
fprintf (stderr,
"Identity crisis - may be called as `" CMD_FOO
"' or as `" CMD_BAR "' but not as `%s'\n",
cmdname);
return -1;
}
編譯
gcc main.c
執行:
$ ./a.out
Identity crisis - may be called as `foo' or as `bar' but not as `a.out'
$ cp a.out foo
$ cp a.out bar
$ ./foo
hello foo.
$ ./bar
hello bar.
實踐應用、小結
在socket測試中,有客戶端、服務端程式碼,可分別在不同檔案中實現,但只有一個入口main函式,只用一個Makefile,在Makefile中將生成的可執行檔案改名為client、server,然後就得到2個程式了。這樣就不需要維護2個Makefile,編譯2次了。從效率上看,還是可以試試。
本文所述的,只是小技巧,對於大型專案來說,不能這樣做。但其思想,還是值得我們學習的。
李遲 2017.7.25 凌晨