当前位置: 技术问答>linux和unix
Gcc 编译器怪异问题 求解
来源: 互联网 发布时间:2016-11-14
本文导语: 我有4个文件,本来想学习下编译动态库的, 遇到一个很诡异的问题。 往高手解答哦。 test1.h: 内容 #ifndef _TEST1_H_ #define _TEST1_H_ void test1(); #endif test1.c: 内容 #include "test1.h" void test1() { printf("Fristn"); } test2...
我有4个文件,本来想学习下编译动态库的, 遇到一个很诡异的问题。 往高手解答哦。
test1.h: 内容
#ifndef _TEST1_H_
#define _TEST1_H_
void test1();
#endif
test1.c: 内容
#include "test1.h"
void test1()
{
printf("Fristn");
}
test2.h:内容
#ifndef _TEST2_H_
#define _TEST2_H_
void test2();
#endif
test2.c:内容
#include "test2.h"
void test2()
{
test1();
printf();
}
gcc编译步骤:
gcc -g -c test1.c
gcc -g -c test2.c
为什么 gcc -g -c test2.c 编译会通过呢?test1()函数 他应该没有声明就用了。 而且 我在test2()函数实现的时候 随便写没有声明的函数都会编译通过。 我晕了~ 忘高手解答
test1.h: 内容
#ifndef _TEST1_H_
#define _TEST1_H_
void test1();
#endif
test1.c: 内容
#include "test1.h"
void test1()
{
printf("Fristn");
}
test2.h:内容
#ifndef _TEST2_H_
#define _TEST2_H_
void test2();
#endif
test2.c:内容
#include "test2.h"
void test2()
{
test1();
printf();
}
gcc编译步骤:
gcc -g -c test1.c
gcc -g -c test2.c
为什么 gcc -g -c test2.c 编译会通过呢?test1()函数 他应该没有声明就用了。 而且 我在test2()函数实现的时候 随便写没有声明的函数都会编译通过。 我晕了~ 忘高手解答
|
gcc 语法检查不严格,如果没有声明test1(),它就认为是一个返回值为整数的函数
因为你使用了-c选项,gcc不会生成最终的执行程序,只是一个语法检查
函数的实现在链接阶段才会使用
因为你使用了-c选项,gcc不会生成最终的执行程序,只是一个语法检查
函数的实现在链接阶段才会使用
|
void test2(void) { test1(); }
main() { test2(); }
void test1(void) { }
这样能编译通过,但是有警告
编译器认为第一行中对test1的调用,也就是test1的第一次出现,属于一个隐式声明int test1();
这个声明与后面的test1的函数定义,原型不一致,但是兼容
void test2(void) { test1(); }
main() { test2(); }
char * test1(void) { }
这样就编译错误了,隐式声明与函数原型不兼容
main() { test2(); }
void test1(void) { }
这样能编译通过,但是有警告
编译器认为第一行中对test1的调用,也就是test1的第一次出现,属于一个隐式声明int test1();
这个声明与后面的test1的函数定义,原型不一致,但是兼容
void test2(void) { test1(); }
main() { test2(); }
char * test1(void) { }
这样就编译错误了,隐式声明与函数原型不兼容