5

我收到此错误:

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 <stdio.h>
#include <stdlib.h>

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;
}

如果我切换它的功能顺序,为什么?

4

5 回答 5

10

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

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

// Declare randomStr function
char *randomStr(int length);
于 2012-11-08T20:30:37.833 回答
5

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

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

于 2012-11-08T20:29:53.890 回答
3

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

由于调用randomStr发生在其声明/定义之前,因此假定为 return int,这与不兼容char *(如果没有显式强制转换,您不能将一个值分配给另一个),因此会出现错误。

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

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

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

于 2012-11-08T21:12:05.163 回答
2

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

例如:

int doesFileExist(const char* str);

会去之前main()

这样做的原因是 C 编译器会运行您的代码,并且每次它看到一个函数时,它都会查看该函数是否已被定义。如果它找不到该功能,它会给你一个错误。main()uses doesFileExist(),在编译器查看时尚未声明main()。为了解决这个问题,你可以在顶部声明一个函数,正如我上面提到的。这告诉编译器,虽然一个函数还没有被填充,但它会在以后被填充,所以把它当作函数确实存在,然后在你以后找到函数后去连接它们(即,在main()函数之后的某个地方)。

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

于 2012-11-08T20:34:47.737 回答
1

只需添加一个函数原型

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

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;
}
于 2012-11-08T22:34:01.593 回答