警告:编译C源时隐式声明函数

时间:2013-12-03 17:33:24

标签: c function

我正在学习C.这是我今天面临的一个问题。当我尝试为main.c创建目标文件时,我得到:

cc -Wall -c main.c
main.c:6:18: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration]

我该如何避免这种情况?

functions.c:

int sum(int x, int y)
{
  return x + y;
}

main.c:

#include <stdio.h>
#include "functions.h"

int main()
{
   printf("%d", sum(1,1));
   return 0;
}

function.h存在,但我没有在这里添加。

4 个答案:

答案 0 :(得分:3)

通常,您的functions.h会包含:

extern int sum(int x, int y);

可能包含标题保护,可能省略extern * 。您应该在定义函数的文件中以及使用它的任何文件中包含标头。这两个部分都很重要;它们允许标题确保函数的使用与函数的定义一致。

C99要求在使用函数之前声明或定义函数,而不是像C ++。

FWIW:我通常使用GCC进行编译,通常使用选项:

gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Wold-style-declaration -Werror \
    ...other arguments as appropriate...

-Werror表示我的代码在没有警告的情况下编译!您还会看到我将static添加到单个文件程序中定义的函数以避免警告(也就是错误),尽管我并不总是懒得评论我为什么要进行此更改。


* 通常,标题应包含标题保护。对于既不需要任何其他headers也不定义任何类型的标题,几乎可以省略标题保护(无论如何我都将它们放入,但只要您认识到它们问题,省略它们也没关系。我更喜欢在函数上使用extern,尽管没有必要。 对于变量,它是crucial

答案 1 :(得分:1)

对于外观,您忘记输入

int sum(int x, int y);

在你的functions.h文件中

答案 2 :(得分:0)

制作两个文件:

  1. functions.c:包含函数的定义

  2. functions.h 包含函数的声明

  3. *定义functions.c中的'sum'函数

    *在functions.h中声明'sum'函数

答案 3 :(得分:0)

我不知道使用-Wall。您不包括funcion.c文件,然后您的程序将如何知道sum()。可能有不止一种方式实现这一点,但我描述的方式有两种 1) 你的文件名       function.h       int sum(int x,int y)         {          返回x + y;         }

然后包括你的主要程序。 2) 文件名sum.c 然后求和函数 在编译时,您必须一次编译两个文件 cc sum.c main.c 那么你不会得到任何错误