C语言怎样定义和声明全局变量和函数最好


Posted in 面试题 onNovember 26, 2013
首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次。定义是分配空间并赋初值(如果有) 的声明。最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器。Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为“公共扩展”, 没有语带双关的意思。
可以使用预处理技巧来使类似DEFINE(int, i);的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。但不清楚这样的麻烦是否值得。如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。

Tags in this post...

面试题 相关文章推荐
数据库连接池的工作原理
Sep 26 面试题
Java中compareTo和compare的区别
Apr 12 面试题
请问如下代码执行后a和b的值分别是什么
May 05 面试题
C语言开发工程师测试题
Dec 20 面试题
用C或者C++语言实现SOCKET通信
Feb 24 面试题
Discard Protocol抛弃协议的作用是什么
Oct 10 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
Nov 20 面试题
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
Jun 07 面试题
什么是SCM(软件配置管理)
Aug 16 面试题
如何写出高质量、高性能的MySQL查询
Nov 17 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
Feb 17 面试题
如何用Java实现列出某个目录下的所有子目录
Jul 20 面试题
C,C++的几个面试题小集
Jul 13 #面试题
Java工程师面试集锦之Spring框架
Jun 16 #面试题
2019年Java 最常见的 面试题
Oct 19 #面试题
2019年Java面试必问之经典试题
Sep 12 #面试题
金讯Java笔试题目
Jun 18 #面试题
某公司Java工程师面试题笔试题
Mar 27 #面试题
JAVA代码查错题
Oct 10 #面试题
You might like
牡丹941资料
2021/03/01 无线电
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
PHP7 windows支持
2021/03/09 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
python类中super()和__init__()的区别
2016/10/18 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
css3中transition属性详解
2014/09/02 HTML / CSS
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
听课评语大全
2014/04/30 职场文书
学生吸烟检讨书
2014/09/14 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
创先争优个人总结
2015/03/04 职场文书
雨中的树观后感
2015/06/03 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
PL350与SW11的比较
2021/04/22 无线电
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL