本文共 1057 字,大约阅读时间需要 3 分钟。
C语言是以文件文件为单位组织的,在一个源程序的所有文件中,一个外部变量和函数只能在源程序中定义一次。由于不同文件中的不同函数和变量很多时候都会相互引用,因此出现了static和extern关键字。这里主要介绍static函数,是对今天的一个编译问题的总结。
学过C++ 应该都知道,类成员有三种类型:public,protected,private。其中private关键字表示该字段只能被该类的成员函数访问,对类外不可见。c中的static关键字和这个意思差不多:凡是加了static关键字的函数,则它只对包含该static函数的文件是可见的,在文件外是不可见的。下面举一个例子说明一下
下面是main函数,它调用了hello函数打印字数组buf,位于文件test.c中。
#includehello函数位于hello.c中#include #include int main(){ char buf[] = "hello world!\n"; hello(buf); return 0; }
#include#include static void hello(char *buf){ write(1,buf,sizeof buf);}
注意,其中的hello函数包含static关键字
编译后
gcc hello.c test.c -o test会出现下面的错误
/tmp/ccU7gZiZ.o: In function `main':test.c:(.text+0x3f): undefined reference to `hello'collect2: error: ld returned 1 exit status表示找不到 hello 函数,然后我们试一下把hello函数改成非static类型的。重复上述过程就可以顺利生成目标代码运行。
所以可以看到,包含static关键字的函数只在他所在的文件中是可见的,在其他文件中不可见,会导致找不到定义。
转载地址:http://viqxi.baihongyu.com/