glibc头文件和宏定义
头文件没啥好说的,无非就是" "和< >的区别,这估计只要是学过C/C++的人都明白。现在的编译器对头文件的包含顺序没有要求,但老的C实现则不一样。当然,我们现在无需关心头文件顺序了。
我们为啥要包含头文件呢?头文件里面有定义嘛,使用任何函数之前都必须定义该函数。所以我们并不强求包含头文件,只要你自己在库函数使用之前定义该函数,有些编译器还会自动的添加标准库定义。但是呐,我们还是推荐将头文件添加上去,头文件里面有时候还会包含类型定义、常量定义、宏定义。
在linux环境下,gcc会在以下路径中查找头文件:/usr/local/include;libdir/gcc/target/version/include;/usr/target/include;/usr/include。C++程序还会查找libdir/../include/c++/version。target是一个标准名指的是你的GCC编译的目录。version则是版本号了。
Gcc可以使用-Idir参数指定头文件目录。-nostdinc选项则会阻止GCC搜寻某个头文件目录。-nostdinc在编译系统内核的时候会很有用,因为系统内核不使用标准C库,内核使用的是源码里面自带的库文件。注意:-nostdinc对-Idir无效。
我们可以在GCC -I选项参数的任意位置放置-I-标志,在-I-标志之前的目录我们只查找由引号标记的头文件,-I-标记之后的目录则查找所有头文件。你要是想指定查找由引号标记的头文件目录,我们不推荐使用-I-标记,而是使用用-iquote选项。
如果很不幸,你有一个目录叫"-"。这种情况下你得使用-I./- 和-I-区别开来。
为了防止头文件被包含多次,你需要使用宏的条件语句:
/*File foo. */
#ifndef FILE_FOO_SEEN
#define FILE_FOO_SEEN /*
*the entire file
*/ #endif /*!FILE_FOO_SEEN*/
这是一种很常见的结构被称为wrapper #ifndef
针对C++的优化:C++会记住wrapper #ifndef的布尔状态,如果第二次重复包含同一个头文件,C++会直接忽略该文件(直接不扫描)。wrapper #ifndef之外的注释并不会影响这种优化。
一般在系统头文件中像FILE_FOO_SEEN这种宏名以“__”开头,所以在个人头文件中建议使用“_”开头,以防冲突。
C++中我们有两种方式防止头文件被重复包含,但我们都不推荐使用。
一、#import
#import实际上来自于Objective-C的标准做法,是#include的一个变种。#import包含头文件,但最多只包含一次。我们不推荐的理由是:#import放权给了用户,用户必须知道一个头文件必须只包含一次。但我们的宗旨是把这一任务交给头文件来完成。
二、#pragma once
#pragma once 指令使用在头文件里面,符合我们的宗旨。但是并不是所有的预处理器都能识别该指令。如果考虑可移植性,该指令显然是要移除的。
在预处理过程中,预处理器会告诉编译器标记符号的位置,实际上就是哪个文件哪一行。编译出错的时候编译器往往会有提示,告诉你错误可能在那个文件哪一行。这是通过语法解析器在解析代码的时候自动插入的$line 宏
在glibc中有的函数可能只是一个宏定义,也可能是一个实实在在的函数。这对我们的程序没什么影响。使用宏定义函数的理由是:可以产生内联扩展,这要比函数调用快的多,缺点是不易于debug(原因是编译器给出的行号不是宏展开的地方,而是宏定义的地方)。基于宏定义函数的缺点,你可能想避免使用宏定义函数。你有两种方式来避免:
1、给函数名添加括号
2、使用#undef预处理指令
比如abs函数,既有宏定义也有函数实现。
#include <stdlib.h>
abs(i); //根据编译器选择可能是宏,也可能是函数调用
(abs)(i); //一定是函数调用 #undef abs
abs(i); //一定是函数调用
glibc头文件和宏定义的更多相关文章
- 头文件的宏定义#ifndef测试
一.入题 在头文件的书写中,都加入了如下内容: #ifndef __头文件名_H #define __头文件名_H #endif 曾经在书中看到的解释是“防止重复定义”,今天突然想到为什么是这样的解释 ...
- C语言的头文件和宏定义详解
原文链接:https://blog.csdn.net/abc_12366/article/details/79155540
- C 头文件、宏、编译问题
@2019-02-15 [小记] > C 头文件的防重复包含是针对同一个源文件而言 原因: #include 头文件就是一段代码的拷贝,头文件中若有类型定义等,重复包含就会造成编译错误,若无类型 ...
- C++ 包含头文件 和 宏的使用 和 条件编译
1 #define命令剖析 1.1 #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. ...
- extern 用法,全局变量与头文件(重复定义)
转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int ...
- Cmake 脚本对项目输出路径和输出头文件的路径定义
对Lib项目的统一输出路径以下时解决方案: set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_O ...
- Python语言、编译解释、动态库静态库、编译过程、头文件
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
- c语言头文件中定义全局变量的问题
c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...
- C语言之在头文件中定义全局变量
通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的? os_var.c文件内容 ...
随机推荐
- 最全面的iOS和Mac开源项目和第三方库汇总
标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...
- jquery formcheck.js
demo下载链接http://pan.baidu.com/s/1hrDCC3y /* Jquery 表单验证插件 janchie 2010.1 janchie@163.com 1.01版 */ ...
- 【C++竞赛 A】xxx的项链
时间限制:2s 内存限制:64MB 问题描述 xxx有一个长度为n的宝石链,宝石有m种不同的颜色.xxx想截取其中连续的一段做一个项链.为了让项链更漂亮,xxx希望项链中的宝石包含所有颜色. 输入描述 ...
- Deepin下python安装uwsgi报错: Python.h:没有那个文件或目录
解决方法是安装python-dev,这是Python的头文件和静态库包 正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包是自动 ...
- 【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description ...
- PHP数组foreach循环如何实现逆序访问?
PHP数组foreach循环如何实现逆序访问? 一.总结 1.array_reverse($array) :foreach(array_reverse($array) as $key=>$val ...
- 使用JSONP解决跨域问题-代码示例
前段时间用JSONP解决了跨域问题,现在不用了,把代码思路记下来,今后说不定还用得上. JS代码 //查询公告数据 function recentpost(){ $.getJSON(cmsUrl+&q ...
- 【codeforces 754A】Lesha and array splitting
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- PatentTips – CoAP Segment size determination
BACKGROUND OF THE INVENTION The subject matter disclosed herein relates to routing data through a ne ...
- Watchdog机制概述
1. Watchdog初始 Watchdog的中文的“看门狗”,有保护的意思.最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正 ...