C语言预处理程序[转]
c语言预处理程序有三种,分别是:
1.包含头文件,如:#include <stdio.h>
2.宏定义(本质是字符串的替换)
如 :#define 宏名 串(宏体)
#define PI 3.14159
#undef 终止宏定义的作用域
如:#undef PI
注:双引号内与宏同名的字符串不做宏体展开
#define R 3.0
#define PI 3.14159
#define L 2*PI*R /*宏体是表达式*/
注:引用宏只占编译时间,不占运行时间。
引用宏没有返回值。
带参数的宏定义的一般形式:
#define 宏名(参数表) 字符串
如:#define S(a,b) a*b /* 对宏定义来说参数不需要指明类型 */
3.条件编译(通常在程序调试中)
#if 常量表达式(为非零值时执行程序段,为0时不执行)
程序段(一般是要调试的程序段)
#endif
#ifdef 标识符
程序段一
#else
程序段二
#endif
功能:标识符之前已经定义,则编译程序段一,否则执行程序段二
c语言预处理关键字:
#define #undef #include #if #ifdef
#ifndef #else #endif #line
(注意:#前面不能留空格)
1.包含文件(include)
#include “文件名”一般文件
#inlcude <文件名>系统文件
编译程序以该文件名的内容来替换该控制行,通常在每个源文件开头出现这样的行,是为了包含公共的#define和全程变量的说明以及函数原型。
使用#include可把其它文件(往往是.h文件)的内容包含进来,#include还允许嵌套使用,如:

使用#include的优点
可以把所有公共的、需要给程序各个函数共享的外部变量说明、函数原型和宏定义、类型定义等都放在某一文件上(通常以.h为文件后缀)。其它文件的开头只须用一条#include “该.h”文件的语句,就可以省去重写这些说明、定义的麻烦,而且程序结构更为清晰。如:
#include <stdio.h>
#include <math.h>
#include “local.h”
2.宏定义
格式:
#define标识符单词串
编译程序用单词串来替换#define后出现的该标识符。宏定义通常有两种用途:
1)定义常量
如:
#define YES1
#define EOF-1
又如:
#define:==
#definethen
#definebegin{
#defineend;}
则可以写出Pascal风格的C程序:
if( i > 0) then
begin
a := 1; b:=2;
end
宏替换不仅对常量定义有价值,使程序增加可读性,而且许多函数都可以通过宏替换来表示,不必进行频繁的函数调用,但宏替换占有空间比函数大。
宏定义函数与普通函数的区别:
实现上,宏函数将相应串替换到函数中,而函数只需提供一个指向其实现代码的指针。
一般只将相对比较简单的函数用宏实现,其速度要比函数快,但占用更多的存贮间。
取消宏定义:#undef YES
3.条件编译
C语言预处理程序提供了根据条件对程序段进行有选择地编译的能力,而这些控制行本身不参加编译。
条件编译形式如下:
#if 常量表达式
#ifdef 标识符
#ifndef 标识符
如:
#if 常量表达式
程序段1 --常量表达式为真时编译
#else
程序段2 --常量表达式为假时编译
#endif
又如:
#ifdefYES
…--YES 已定义时编译
#else
…--YES 未定义时编译
#endif
我们经常可在一些头文件中见到下面语句:
#ifndef _ _THIS
#define _ _THIS
…
#endif
可用它们来避免该头文件被重复包含。
4.行控制
格式:
#line 常量[标识符]
常量 –给定行号
标识符 –命名当前的输入文件名
提示编译程序自下行开始的源程序给出该行号。
C语言预处理程序[转]的更多相关文章
- (转载)C语言预处理
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...
- C语言预处理命令总结大全
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...
- C语言预处理指令
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...
- C语言预处理命令总结大全 :宏定义
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...
- c++宏使用总结【转】
C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境. ANSI标准定义的C语言预处理程序包括下列命令: #de ...
- C++ 中常见预定义宏的使用
http://blog.csdn.net/hgl868/article/details/7058906 替代字符串: #define DOWNLOAD_IMAGE_LOG /var/log/png.l ...
- C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
宏在代码中的使用实例: g_RunLog2("Middleware client for Linux, build:%s %s", __DATE__, __TIME__); 下面详 ...
- 嵌入式Linux-GNU Make 使用手册(中译版)
GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...
- C 宏定义
C/C++中宏使用总结 .C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释 ...
随机推荐
- android 图片缩放抗锯齿
之前用的时候只设置了antialias属性,其实要设置两个flag才行 paint.setFlags(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG); ...
- android开发 自定义图文混排控件
功能:图文混排,可自动缩放字体,如图: 单点触控使用的代码来自:http://blog.csdn.net/xiaanming/article/details/42833893 谢谢博主! 在该dem ...
- JavaScript 变量、作用域和内存问题
JavaScript的基本类型值和引用类型值具有以下特点: 1.基本类型值在内存中占据固定的大小,因此被保存在栈内存中: 2.引用类型值是对象,保存在堆内存中: 3.从变量向另一个变量复制基本类型的值 ...
- 图解SQL的Join(转摘)
转摘网址:http://coolshell.cn/articles/3463.html 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的 ...
- Ubuntu 下编译安装linux
1. 准备工作切换为管理员权限,sudo –i 输入用户密码 进入root 权限apt-get install build-essential kernel-package libncurses5-d ...
- __int64 与long long 的区别 分类: Brush Mode 2014-08-14 10:22 64人阅读 评论(0) 收藏
//为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数 //结果VC中还是认为是32位的,显然不合适 //typedef signed long int ...
- windows phone中ListBox的简单使用
学习windows phone数据绑定的一点点心得,在wp系统的APP中经常遇到这样风格的软件,那它们到底怎样实现的呢?我就大致去做了一下,比较粗虐,但基本的都已经有了,实现后的结果为: 哇,这个图截 ...
- XSS的原理分析与解剖(一)
0×01 前言: <xss攻击手法>一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的<白帽子讲WEB安全>和cn4rry的<XSS跨站脚本攻击剖析 ...
- 提高Asp.Net应用程序性能的十大方法(译感)
译完了提高Asp.Net应用程序的十大方法这篇文章,仔细想其中提到的每一条,在这里结合我的项目来谈谈.第一条:返回多个结果集因为我的项目中所有对数据库的访问的sql语句都是通过调用存储过程实现的,所以 ...
- mysql同时修改2个表思路
1.需求:修改评论表中的昵称为手机号码最后4位. ,) AND issuer_name LIKE '1%'; 2.由于误操作(MID(issuer_name,4,6)是中间的6位),需要数据回滚. 3 ...