2013-05-09 34 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