预处理命令(宏定义,条件编译,头文件)

宏定义

<1>不带参数宏定义:#define PI 3.1415926

<2>带参数的宏定义:

#define PI  3.1415926

#define S(r)  (PI*(r)*(r))

void main(){float  a=2,area;area=S(a); }

用宏可以得到几个结果:

#define CIRCLE(R,L,S,V)  L=2*PI*(R);S=PI*(R)*(R);V=4.0/3.0*PI*(R)*(R)*(R)

void main(){float r=2,l,s,v;CIRCLE(r,l,s,v);}

可以用(#undef 标志符)命令终止宏定义的作用域。

<3>宏定义的副作用:避免在宏参数中使用自增,自减

#define MIN(A,B) ( (A) <= (B) ? (A) : (B) )

least = MIN(*p++, b);

本函数中,A = *p++ 代入宏函数,得(*p++)<(B) ? (*p++) : (B) ,如果*p++ < B 那么MIN宏中 p++了两次

注意:

a,符号常量的使用:用于计算式的常量代表数组大小的常量,循环次数,数字是系统代码(如EOF)

b,函数调用与宏调用:程序运行时,函数调用把参数的值传递给函数;而编译前,宏调用把参数的语言符号传递给程序。

使用函数节省空间,使用宏调用节省时间。宏产生内联代码,宏不检查其中的变量类型。

c,宏的名字不能有空格;用圆括号括住每个参数和宏的整体定义。在嵌套循环中使用宏更有助于加速程序运行。

条件编译

<1>#ifdef  标志符

程序段1

#else

程序段2

#endif

作用:若所指定的标志符已被#define 定义过并且没有被#undef关闭,则在程序编译阶段编译程序段1,否则编译程序段2.

在调试程序时:

#ifdef  DEBUG           //在他的前面有命令:#define DEBUG,调试完成后删除该句就可。

printf("x=%d,y=%d\n",x,y);

#endif

<2>#ifndef 标志符

程序段1

#else

程序段2

#endif

作用:标志符没有被定义过执行程序段1.可以防止该宏被重复定义

应用:a,可用较小的数组来测试程序。当程序令人满意后,去除#define SIZE 10重新编译,这样不必修改头文件数组自身了。

b,防止多次包含同一头文件

//“arrays.h”中

#ifndef SIZE

#define SIZE   100

#endif

//在包含该头文件的源文件中

#define SIZE 10

#include "arrays.h"

//防止头文件重复包含

#ifndef  THING_H_

#define    THING_H_

/*头文件的其余部分*/

#endif

<3>表达式中可使用关系运算符和逻辑运算符

#if 常量整数表达式或define  (VAX)

#include "a.h"

#esif  SYS==3

#include

#endif

<4>预定义宏:不能用#undef取消

__DATE__(进行预处理的日期 "Mmm dd yyyy")     __FILE__(当前被编译源文件的文件名)      __LINE__(当前被编译代码行的行号)

__STDC__(设置为1时表示该实现遵循C标准)    __STDC_HOSTED__(为本机环境设置为1,否则为0)

__STDC_VERSION__(为C99时设置为 199901L)  __TIME__(源文件编译时间"hh: mm: ss")

#line 指令用于重置__LINE__ 和 __FILE__ 宏:#line 10 "cool.c" 行号重置为10,文件名重置为cool.c

#error 指令使编译器发出一条错误消息,该消息包含指令中的文本。编译过程可能中断

#if __STDC_VERSION__ != 199901L

#error Not C99

#endif

#pragma 用于修改编译器的某些设置

头文件

#define指令,结构声明,typedef语句,函数声明,

外部变量声明:extern int status,static 和 const同时修饰的全局变量

内联函数(用static和inline修饰)

内部函数,外部函数和内联函数

<1>内部函数:定义时用static修饰,只能被本文件中其他的函数调用

作用:使用内部函数,可以使函数的作用域只局限于所在的文件,不同的文件有同名的内部函数,互不干扰,通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面加static使之局部化,其他文件不能引用。

<2>外部函数:在定义时加extern的函数,可供其他文件调用

作用:一般将其函数声明放在源文件对应的头文件中,在需要调用此函数的文件中包含该头文件

<3>内联函数:定义时用inline修饰

注意:

a,无法获得内联函数的地址,内联函数不会再调试器中显示。将内联函数的代码插入到调用该函数的地方,内联函数一般较短。

b,其作用是:代码长度增加,程序执行时间减少。

c,内联函数具有内部链接,只能在被定义的文件中被调用。‘

d,多文件中使用内联函数:在头文件中定义内联函数。并用static修饰

时间: 2024-10-17 17:46:38

预处理命令(宏定义,条件编译,头文件)的相关文章

App开发流程之通用宏定义及头文件

工欲善其事,必先利其器. 在正式实现各种炫酷的功能和UI前,做好准备工作是提高后续开发效率的必经之路. 所以,这个系列,我不是在各种堆技术,更关注的是“兵马动”之前的“粮草行”,有些繁琐,但当清晰理出整个脉络,后续的工作只是在良好的基础和框架上无限扩展和优化. 宏定义,是开发过程中提高效率的有效工具.很有必要归纳一些全局通用的宏定义,以便简单高效的使用. 如下,整理了一些通用宏定义,应该是开发必备的: #pragma mark -- 设置全局尺寸宏 #define StatusBarHeight

stm32工程建立中关于宏定义和启动文件的选择

在STM32的学习过程中,第一步关于stm32工程的建立就会难倒很多人,因为他不像其他AVR 51单片机这些,options中的配置比较复杂,其中最让人头疼的就是关于c/c++ compiler选项中preprocessor这个选择框,现在我就对其中的两项进行说明,一是为了让以后学习STM32的同学能更快的了解,二是为了让我自己更好的复习. 如上图所示  其中 additional include directories下面的框需要添加工程内头文件所在的路径,'$PROJ_DIR$'表示的是工程

《黑马程序员》预处理指令(宏定义、条件编译、文件包含)(C语言)

宏定义的基本概念 ●  预处理指令都是以#开头 ●  预处理指令分为三种 1.宏定义 定义格式:#define  宏名   参数 2.条件编译 #if 条件语句     statement1; #elif 条件语句     statement2; #else     statement3; #endif       //条件编译结束必须加上此条语句,否则statement3以下的所有语句都将默认为不编译 3.文件包含 ●  预处理指令在代码翻译成0和1之前进行 ●  预处理指令的位置是可以写的

C语言学习入门 (六) 预处理指令:宏、条件编译、文件包含

预处理指令 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令), 产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾. 习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 不带参数的宏定义 #define 宏

预处理指令--宏定义

预处理指令简介 •C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 •为了区分预处理指令和一般的C语句,所有预处理指令都以符号“#”开头,并且结尾不用分号 •预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾.习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 •C语言提供的预处理指令主要有:宏定义.文件包含.条

C++面试常见问题——01预处理与宏定义

C++面试常见问题--------01预编译和宏的使用 C++预处理器 预处理器是一些指令,它将指示编译器在实际编译之前需要完成的预处理.预处理必须要在对程序进行词法与语义分析.代码生成与优化等通常的编译过程之前进行,经过预处理的程序不再包含之前的预处理命令. 所有的预处理器指令都以#号开始,并且前面不可以出现除了空白字符以外的字符.预处理器指令不是C++指令,所以不需要以 :结尾.所有的C++程序实例都有预处理器指令 #include,这个宏用于把头文件包含在源文件中. 预处理器指令是C++统

c 预处理的宏定义

概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所定义的宏名.“字符串”可以是常数,表达式.格式串等 举例: #define PI 3.1415926 作用: 就是用指定标识符PI来代替数3.1415926 对源程序作编译时, 将先由预处理程序进行宏代换, 即用3.1415926表达式去置换所有的宏名PI, 然后编译 #include <stdio.h

C/C++函数重复定义、头文件重复包含、互相包含问题

1.避免头文件重复包含 // test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndef TEST_H_ #define TEST_H_ //头文件内容 #endif 或者 // test.h 告诉预编译器只包含一次 #pragma once 2.避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义.因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义.但是几种情况

【转载】防止变量重复定义、头文件重复包含、嵌套包含

[转自] http://hi.baidu.com/zengzhaonong/blog/item/8a8871062d481f7f03088106.html #include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码: #include "x.h"#include "x.h" 显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码.但是下面的代码:#include "a.h"#include "

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由Point派生出Circle类,再由Circle派生出Cylinder类.将类的定义部分分别作为3个头文件,对他们的成员函数的定义分别作为3个源文件 1.Point.h文件 1 #ifndef POINT_H 2 #define POINT_H 3 #include<iostream> //头文件也需要包含这个 4 using namespace std; 5