警告

没有函数声明

关键词:implicit declaration,隐式声明

没有函数声明–>导致编译器–>隐式函数声明

注:在函数调用前没有声明,则编译器会使用默认说明(隐式说明)来解释函数调用规则。

// test.c

int main(int argc, char *argv[])
{
	add(1, 2);

	return 0;
}

int add(int a, int b)	// 没有函数声明
{
	return a + b;
}
$ gcc test.c -o test.out -Wall -lpthread
test.c: In function ‘main’:
test.c:3:2: warning: implicit declaration of function ‘add’ [-Wimplicit-function-declaration]
    3 |  add(1, 2);
      |  ^~~

报错

函数定义与声明不一致

关键字:conflicting types,冲突类型

// test.c

int add(unsigned int a, int b);	// 函数声明,unsigned int a

int main(int argc, char *argv[])
{
	add(1, 2);

	return 0;
}

int add(int a, int b)	// 函数定义,int a
{
	return a + b;
}
$ gcc test.c -o test.out -Wall -lpthread
test.c:10:5: error: conflicting types for ‘add’
   10 | int add(int a, int b)
      |     ^~~
test.c:1:5: note: previous declaration of ‘add’ was here
    1 | int add(unsigned int a, int b);
      |     ^~~
make: *** [Makefile:2:all] 错误 1

多重定义

多个 .o 同时包含同一个全局变量,在链接时就会报多重定义。

关键词:multiple definition,多重定义

典型错误:在头文件中定义全局变量。

// test.c

int a = 3;

int main(int argc, char *argv[])
{

	return 0;
}

// test2.c

int a = 4;
$ gcc test.c test2.c -o test -Wall
/usr/bin/ld: /tmp/ccL7rgeW.o:(.data+0x0): multiple definition of `a'; /tmp/ccRO4TfW.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status

重复定义

变量或函数重复定义

关键词:redefinition

// test.c

int a = 3;
int a = 4;

int main(int argc, char *argv[])
{

	return 0;
}
$ gcc test.c -o test -Wall
test.c:4:5: error: redefinition of ‘a’
    4 | int a = 4;
      |     ^
test.c:3:5: note: previous definition of ‘a’ was here
    3 | int a = 3;
      |     ^

结构体类型未定义

关键词:storage size of ‘xxx’ isn’t known,存储大小未知。

结构体类型未定义,当然不知道它需要占用多大的存储空间了

// test.c

int main(int argc, char *argv[])
{
	struct test a;

	return 0;
}
$ gcc -Wall test.c -o test
test.c: In function ‘main’:
test.c:5:14: error: storage size of ‘a’ isn’t known
    5 |  struct test a;
      |              ^
test.c:5:14: warning: unused variable ‘a’ [-Wunused-variable]

解决办法:如果不方便包含头文件,可以只添加结构体类型声明

// test.c

struct test;	// 结构体类型声明

int func(struct test a);

int main(int argc, char *argv[])
{

	return 0;
}
// test2.c

struct test {
    int a;
};
# Makefile

test : test.o test2.o
	gcc test.o test2.o -o test