全部博文(163)
分类: C/C++
2010-11-02 09:51:02
1.static和extern:
大工程下我们会碰到很多源文件。
|
上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。
|
extern的另外用法是当C和C++混合编程时如果c++调用的是c源文件定义的函数或者变量,那么要加extern来告诉编译器用c方式命名函数:
|
2.static法则
A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
extern "C"{#include "cExample.h"}
/*c语言头文件:cExample.h*/#ifndef C_EXAMPLE_H#define C_EXAMPLE_Hextern int add(int x, int y); //c中导出函数add#endif/*c语言实现文件:cExample.c*/#include "cExample.h"int add(int x, int y){return x+y;}//以上C和h以.c方式被编译,产生"_add"这样的符号//c++实现文件,cppFile.cppextern "C"{#include "cExample.h"}int main(int argc, char *argv[]){add(2,3);return 0;}.cpp以.cpp方式被编译: 而add()被extern "C"限定为C方式编译为_add在调用: add(2,3)时,就调用_add(2,3)当cExample.c和cppFile.cpp的.o文件连接时,就把符号匹配上
//C++头文件 cppExample.h#ifndef CPP_EXAMPLE_H#define CPP_EXAMPLE_Hextern "C" int add(int x, int y);#endif//C++实现文件 cppExample.cpp#include "cppExample.h"int add(int x, int y){return x+y;}//cpp以.cpp方式被编译: 而add()被extern "C"限定为C方式编译为_add/*C实现文件cFile.c/*这样会编译出错:#include "cExample.h"*/extern int add(int x, int y);int main(int argc, char *argv[]){add(2,3);return 0;}.在c中就直接调用就可以了.