函数声明顺序在c语言中是重要的还是我做错了什么?

我收到此错误:

arthur@arthur-VirtualBox:~/Desktop$ gcc -o hw -ansi hw1.c hw1.c: In function `main': hw1.c:27:16: warning: assignment makes pointer from integer without a cast [enabled by default] hw1.c: At top level: hw1.c:69:7: error: conflicting types for `randomStr' hw1.c:27:18: note: previous implicit declaration of `randomStr' was here 

在编译此代码时:

 #include  #include  int main(int argc, char** argv) { char *rndStr; rndStr = randomStr(FILE_SIZE); /* Do stuff */ return 0; } /*Generate a random string*/ char* randomStr(int length) { char *result; /*Do stuff*/ return result; } 

如果我切换它周围的function顺序,为什么呢?

除少数例外情况外,C语言中的标识符在声明之前不能使用。

以下是如何在其定义之外声明一个函数:

 // Declare randomStr function char *randomStr(int length); 

发生错误是因为符号通常必须使用之前声明,而不是之后。

一个特殊的例外是函数。 如果在声明之前使用它们,则推断出特定声明。 在您的情况下,推断声明与最终定义不匹配。

您需要在使用尚未定义的函数的任何函数之前放置函数声明。

例如:

 int doesFileExist(const char* str); 

会在main()之前。

这样做的原因是C编译器会运行您的代码,每次看到一个函数时,它都会查看该函数是否已经定义。 如果找不到该function,则会出错。 main()使用doesFileExist() ,它在编译器查看main()时尚未声明。 要解决这个问题,您可以在顶部声明一个函数,如上所述。 这告诉编译器,尽管尚未填充函数,但它将在稍后填充,因此将其视为函数确实存在,然后在稍后找到函数后再连接它们(即,在main()函数之后的某个地方)。

您的第二个代码块起作用,因为编译器具有您在main()到达那里时使用的那些函数的定义。 您的第一个块不起作用,因为函数既未定义也未声明它们将在以后定义。

在C89及更早版本中,如果编译器在相应的声明或定义之前看到函数调用 ,则它假定函数返回int 。 类似地,如果你将类型说明符从函数定义中删除,则假定它返回int (这就是为什么很多旧的例子都有一个只有main() {...}的条目而不是int main(void) {...} )。

由于对randomStr的调用发生在其声明/定义之前,因此假定它返回int ,它与char *不兼容(如果没有显式randomStr ,则不能将值1分配给另一个),因此会出错。

从C99开始,不再允许隐式类型。

-ansi选项使gcc编译为C89。 要编译为C99,请改用-std=c99

我通常在第一次使用函数定义之前将函数定义放在同一个文件中,因此我的代码从下往上读取( main通常是文件中定义的最后一个函数)。 这样我就不必担心保持声明和定义。

只需添加一个函数原型

 #include  #include  char* randomStr(int length); int main(int argc, char** argv) { char *rndStr; rndStr = randomStr(FILE_SIZE); /* Do stuff */ return 0; } /*Generate a random string*/ char* randomStr(int length) { char *result; /*Do stuff*/ return result; }