C 语言编译常见报错
警告
没有函数声明
关键词: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