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文件内容 ...
随机推荐
- 访问sharepoint站点自动使用当前用户名和密码登录
https://blog.csdn.net/zw_2011/article/details/7417123 1.把sharepoint站点添入可信站点. 点击菜单栏“工具”——〉“Internet ...
- 【u211】编码
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 假设phi(W)得到是按照以下算法编码后的结果: 1. 如果W的长度为1那么phi(W)即为W: 2. ...
- 【转】request和response的页面跳转
跳转:request.getRequestDispatcher("p3.jsp").forward(request,response);这种方法称为转发,地址栏上的URL不会改变: ...
- BZOJ 2096 Pilots - 单调队列STL(deque)
传送门 分析: 单调队列:维护两个递增.递减的队列,每次都加入新元素并更新,如果最大值(递减队首)-最小值(递增队首) > k,那么将最左段更新为前面两者中较前的那一个,并弹掉.用deque可以 ...
- Tomcat的JVM经常挂掉,根据hs_err_pid23224.log这种日志文件,也没能发现具体是什么原因导致的
## A fatal error has been detected by the Java Runtime Environment:## SIGBUS (0x7) at pc=0x00007f1a ...
- 7个在线学习C++编程的最佳途径
7个在线学习C++编程的最佳途径 jopen 2012-09-27 15:51:13 • 发布 摘要:C++是一种静态数据类型检查的.支持多重编程范式的通用程序设计语言.它支持过程化程序设计.数据抽象 ...
- TextView中实现跑马灯的最简单方法
几行代码实现跑马灯效果,效果如下: 因为很简单,所以就直接贴代码喽 <TextView android:id="@+id/item1_title_message" andro ...
- 【t003】string
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为" ...
- 【codeforces 785B】Anton and Classes
[题目链接]:http://codeforces.com/contest/785/problem/B [题意] 给你两个时间各自能够在哪些时间段去完成; 让你选择两个时间段来完成这两件事情; 要求两段 ...
- maven webcollector java.lang.ClassNotFoundException: org.openqa.selenium.remote.SessionNotFoundException
使用webcollector时出现了如下异常 分析是依赖的问题,不仅要添加selenium-java,还要添加htmlunit-driver的依赖,注意不要添加成selenium-htmlunit-d ...