头文件相关注意事项

/**
 *为防止头文件被重复包涵
 */
#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;
}
*/
From: http://www.cnblogs.com/ganrui/
原文地址:https://www.cnblogs.com/ganrui/p/3692303.html