/**
*为防止头文件被重复包涵
*/
#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;
}
*/