• 头文件相关注意事项


    /**
     *为防止头文件被重复包涵
     */
    #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/
  • 相关阅读:
    负反馈
    阻抗匹配
    音频功放电路
    ##Springboot框架的简单分享,让你入门不是难事
    ##如何用安全框架去实现登陆功能?(包含去实现用户名的实现)
    ##如果你的JVM的小红小绿提示你需要更新怎么办?下面来教你一下子解决
    ##如果我们要用分布式做项目,那么需要安装一个zookeeper,下面给大家简单分享下安装步骤
    ##ENGINE=MYISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8
    ##SSM框架整合(Spring框架/Spring MVC框架/Mbatis框架)
    ##SSM框架整合中web.xml配置文件
  • 原文地址:https://www.cnblogs.com/ganrui/p/3692303.html
Copyright © 2020-2023  润新知