/** *为防止头文件被重复包涵 */ #ifndef _TEST_H_ #define _TEST_H_ /** *C/C++相互调用时,如果该头文件被C++编译器处理,则要求 *编译器对头文件中的内容采取C标准的编译方式编译,如果 *该头文件是C++中相应模块的对外头文件,则同时要求在该 *头文件中涉及到的C++函数在其源文件中定义时要用 *extern "C"修饰如: *在C++头文件中有: *void funccpp(void); *则在C++源文件中有: *extern "C" void funccpp(void){...}; *在C中可以不考滤此限制; */ /** *该方法主要是防止写的C函数被C++调用,如此这样,C++就可 *以采用与C相同的方法调用C函数;而C++供C调用的函数只需要 *在定义时用extern "C"修饰即可,不需要头文件中的此功能支持 */ /** *有此功能支持的头文件,在该头文件声明函数时,不需要在其 *前面添加extern或extern "C" 修饰 */ #ifdef __cplusplus extern "C"{ #endif /** *该功能需要在模块文件在引用该头文件之前定义TEST_GLOBLE宏 *即模块文件中,引用该头文件前应加:#define TEST_GLOBLES */ #ifdef TEST_GLOBLES # define TEST_EXT #else # define TEST_EXT extern #endif /** *typedef 最大作用域:不超出所在文件 *所以typedef的类型定义可以放在头文件中 * *const 最大作用域:在 C++ 中不超出所在文件 *const 最大作用域:在 C 中为全局作用域 *因此,在C++中,const变量可以定义在头文件并在其中初始化,但不提倡 *如此定义;在C中,const变量在源文件中定义和初始化,在头文件 *中声明;由于C++中const作用域的限制,其定义在C++源文件中的 *const变量需用extern声明,并同时在其头文件中用extern声明, *所以,C和C++中统一采用同一种定义和声明方式:在源文件中定义 *为: extern const type var_const = init_value; *在头文件中声明 *为: extern const type var_const; *该规则适用于C/C++ * */ struct test_struct{ char var_char; int var_int; }; typedef struct test_struct test_t, *ptest_t; TEST_EXT test_t var_test_t; TEST_EXT ptest_t var_ptest_t; TEST_EXT int var_other; extern const int var_ext; /** *为考滤通用性和一致性,C/C++中文件作用域函数定义时加"static" *如:static void func_static(void){...} *C中全局作用域定义时加“extern”修饰 *如:extern void func_globle_c(void){...} *C++中全局作用域定义的供C调用的函数要加extern "C"修饰 *如:extern "C" void func_globle_c(void){...} */ void func(void); /** *与之配对使用 *#ifdef __cplusplus * extern "C"{ *#endif */ #ifdef __cplusplus } #endif #endif //////////////////////////////////////////////////////////// //以下是模块文件样例:test.c /////////////////////////////////////////////////////////// /* #define TEST_GLOBLES #include "test.h" static int globle_file_var = 0; static const int var_a = 5; extern const int var_ext = 20; void func(void) { return; } static void in_file_func(void) { return; } */