2013-05-09 60 views
-4

爲什麼這樣的代碼:ç比較字符串字面量函數返回字符指針

strcmp(myfunction(0), "OK"); 

其中myFunction是這樣定義的:

char *myfunction(int p) 
{ 
    if (p == 0) 
    { 
     return("OK"); 
    } 
} 

提供以下錯誤:

warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast 
+3

在調用之前是否聲明瞭'myfunction()'? – 2013-05-09 18:33:19

+3

您在調用之前忘記聲明'myfunction'。這已經被問過數百萬次了。按照您的錯誤信息進行搜索會導致同一問題的大量答案。 – AnT 2013-05-09 18:34:11

回答

2

在呼叫之上是否有原型?該功能應該是原型或在使用之前進行定義。否則,編譯器將假定它具有默認返回類型int

// Prototype 
char *myfunction(int p); 

int main() 
{ 
    // Use 
    strcmp(myfunction(0), "OK"); 
} 

// Definition 
char *myfunction(int p) 
{ 
    ... 
} 
+0

太棒了,那可行!我認爲這是一個指針問題...所以我開始隨機應用*和&。應該先來這裏! – ian93 2013-05-09 18:39:40

3

因爲編譯器在調用時不知道myfunction()的定義。 然後編譯器假定它返回一個int ...並給出該消息。

解決方案:在調用函數(或其定義,作爲原型)之前提供原型。

2

若要在John的答案上構建,大多數C編譯器將允許您調用編譯器尚不知道的函數。這使您可以將呼叫站點的功能分開執行,希望它能夠進行增量構建,並允許您使用外部來源的功能。

在這種情況下,編譯器假定該函數返回一個int,所有參數都是int類型的,因爲編譯器還沒有被提供的功能原型(或者在外面的文件或在頭文件的任何功能)。編譯器做這個假設的原因是歷史的基礎上,K&R C

發展如果開啓嚴格的ANSI模式(-std=c99 -pedanticgcc)的文件將無法編譯,因爲它通常被認爲是一個壞主意在不知道參數類型的情況下調用函數。

這就是爲什麼你會收到警告。

你應該把下面的源文件的頂部:

char *myfunction(int p);

在該行的最後的分號告訴編譯器,這是一個功能原型而不是實現 - 編譯器假定來自某個其他翻譯單元。

+1

很好的解釋,但我有一個小分歧。雖然隱式int實際上不再是標準的一部分,但似乎你暗示未指定的參數列表也不是。如果是這樣,(不幸的是)並非如此。它已被棄用,但不被禁止。舉例來說,請參見C11規範的第6.11.6節和http://ideone.com/eTOS5V。如果我誤解了你,我道歉。 – jerry 2013-05-10 01:46:10

+0

@jerry是的,那個例子在嚴格的ANSI模式下編譯時沒有警告。標準組織正在做什麼? – ldrumm 2013-05-10 10:54:31