2015-07-10 81 views
1

的隱式聲明我不斷收到功能「execle」的功能「execle」錯誤

隱式聲明編譯下面的代碼時,在C99

無效。我錯過了什麼?

#include <stdio.h> 
#include <stdlib.h> 

char *my_env[] = {"JUICE=PEACH and apple", NULL}; 

int main (int argc, char *argv[]) 
{ 
    execle ("diner_info", "diner_info", "4", NULL, my_env); 
    printf ("Diners: %s\n", argv[1]); 
    printf ("Juice: %s\n", getenv("JUICE")); 
    return 0; 
} 
+4

在使用* any *庫函數之前,請閱讀其手冊頁以找出需要包含哪些頭部。 –

回答

4

C99,隱式聲明OS的功能是不允許的。這意味着,編譯器在遇到對該函數的調用之前應該知道函數簽名。這可以通過兩種方式實現:

  1. 在使用它之前定義該函數。
  2. 提供函數的前向聲明並在稍後定義它。

通常,函數簽名通過頭文件作爲前向聲明提供。

根據man pageexecle(),您需要包含unistd.h才能獲得前置聲明。

+0

這確實得到了警告,但程序仍然沒有任何結果。只是坐在那裏無所事事。 goodsubject -lm:chap9 varunvb $ gcc diner_info.c -o diner_info && ./diner_info – Ani

+0

@Ani:你期望程序做什麼?從'exec *()'手冊頁:*只有在發生錯誤時纔會返回'exec()'函數。*「」 – alk

+0

@alk爲什麼printf語句不起作用printf(「Diners :%s \ n「,argv [1]); printf(」果汁:%s \ n「,getenv(」JUICE「));我認爲他們會打印出Diners:4和果汁:PEACH和蘋果 – Ani

3

您需要包括unistd.h中解決隱性月警告

0

我得到它的工作。事實證明,這是陳述的順序。 execle後的任何內容都不會運行。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 


    char *my_env[] = {"JUICE=PEACH and apple", NULL}; 
int main (int argc, char *argv[]) 
{ 
    printf ("Diners: %s\n", argv[1]); 
    printf ("Juice: %s\n", getenv("JUICE")); 
    execle ("diner_info", "diner_info", "4", NULL, my_env); 
    return 0; 
} 

結果:

# :$ gcc diner_info.c -o diner_info && ./diner_info 
Diners: (null) 
Juice: (null) 
Diners: 4 
Juice: PEACH and apple 
Diners: 4 
Juice: PEACH and apple 
Diners: 4 
Juice: PEACH and apple 
Diners: 4 
Juice: PEACH and apple 
Diners: 4 
Juice: PEACH and apple 
Diners: 4 
Juice: PEACH and apple 

但我還是不明白,爲什麼在上面的空值,雖然。

+1

那麼這些空值是因爲main在printfs之前沒有運行execle: -/ – Ani

+0

您實際上需要檢查argc。 –

+0

建議在編譯時始終啓用所有警告,然後編譯器會告訴你主參數'argc'沒有被使用,在嘗試使用任何命令行參數之前應始終檢查argc ,以確保所需的參數實際存在。 – user3629249