2008-10-30 37 views
2

在下面的代碼片段中,我可以將char *替換爲const char *並刪除strdup()函數調用,並直接採用由getopt()設置的optarg值?我建議使用const char *來跳過strdup函數的用法。提前感謝幫助。當在C中使用getopt時,const char *和strdup是否提供相同的功能?

/* Code Snippet */ 
char *dir = NULL; 
char *bld = NULL; 
int chr; 

while ((chr = getopt(argc, argv, "d:a:b:f:")) != -1) { 

switch (chr) { 

    case 'd': //Directory parameter 
    dir = strdup(optarg); 
    if (dir == NULL) { /*Error*/ } 

    case 'b': //Build parameter 
    bld = strdup(optarg); 
    if (bld == NULL) { /*Error*/ } 
    ...other code... 
} 
} 

我真的不明白這樣做的必要性。

編輯:謝謝你的答案。這真的很有幫助。我將代碼修改爲const char *並跳過了strdup調用。

感謝, 禮居

+0

我建議使用更大的縮進,每個級別一個字符;很難看到縮進的位置。我個人使用4個空格; Linux內核使用8個空格(實際上,製表位設置爲8)。 – 2008-10-30 23:10:39

回答

2

由於optarg被聲明爲'extern char *optarg;',所以您不必使用'const char *',但最好不要修改程序的參數。我建議,它將取決於你用你的dirbld變量調用的函數是否是常量正確的。如果他們是你的代碼,你可以讓他們如此;如果沒有,你可能會發現保持變量非常量更簡單。您不需要撥打'strdup()'(這是POSIX標準,但不是C - 如ISO/IEC 9899:1999)。

2

我從(http://linux.die.net/man/3/optarg)的理解是,OPTARG指向的argv緩衝區的內容所以的strdup是沒有必要的。建議使用const char *似乎是一個合理的想法。

2

兩者都是很好的建議。您可能不想更改dir和bld,因此將它們聲明爲const char *而不是char *在任何情況下都很有用,因爲編譯器會檢測到更多編碼錯誤。通過擺脫strdup,你只是避免了一個不必要的副本(取決於你以後對dir做什麼),但它會爲你的optarg創建一個別名。

相關問題