2016-11-29 24 views
2

我正在用C編寫一個程序,我希望它能檢測到它自己的名字。我會解釋:如何使用gcc編譯後獲取執行文件的名稱?

我希望它做一個特定的動作,具體取決於它的名字。比方說:

if (!strcmp(myName, "Program1")) 
     printf("I am program 1!"); 
    else 
     printf("I am someone else !"); 

此代碼包含在Program1.c,並與編譯:

gcc Program1.c -o Program1 

而且我與執行:

./Program1 

但我無法找到允許我獲取值「Program1」(可執行文件的名稱)的代碼,這將成爲我給出的代碼中的變量myName。

有人可以幫我嗎?

+1

首先,在C中,您無法將字符串與'myName ==「Program1」'進行比較。但在'main'中,你可以檢查'argv [0]'這是可執行文件的名稱(可能還有路徑)。 –

+0

是的,對不起,我累了,想做我想清楚的,但它確實是不正確的。感謝您的回答! – Alan

+0

在MSVC中,'argv [0]'包含我在控制檯輸入的內容,例如'test.exe'或'.. \ ctest \ test',當我從GUI運行時它會給出'F:\ Work \ CTEST \ test.exe'。所以你的名字匹配需要相當小心;) –

回答

3

默認情況下,gcc的輸出名稱並不存儲在文件的任何位置,我不知道如何將它注入到二進制文件中。但這是你真正想要的嗎?

程序被調用爲的名稱爲可用作argv[0]。如果可執行文件在編譯後重命名,則可能會有所不同。

#include <stdio.h> 
int main(int argc, char *argv[]) { 
    printf("My name is %s\n", argv[0]); 
    return 0; 
} 

參數0由調用程序選擇。它可以是一個包含目錄信息的完整路徑(它通常取決於調用者是執行PATH查找還是從顯式位置調用可執行文件),因此如果您想基於此操作,則應該刪除路徑信息(例如,使用basename在Unix/POSIX平臺上)。

參數0是由調用者選擇的,所以這是一個慣例。但這是一個非常普遍遵循的慣例,除非主叫方有充分的理由不尊重它。大多數平臺都有找到可執行文件的方法。例如,在Linux上,/proc/self/exe是可執行文件的符號鏈接。但在大多數情況下,如果調用者傳遞了不同的名稱,這意味着調用者希望程序表現爲不同的名稱,因此argv[0]是您應該使用的。

argv[0]如果程序調用時沒有參數(即如果argc爲0),則可以爲NULL。這很少見,但爲了健壯性,在這種情況下,您的程序應該做一些明智的事情。

+0

非常感謝你的回答,我想我可以解決這個問題! – Alan

相關問題