C预处理器

C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:

指令 描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,返回真
#ifndef 如果宏没有定义,返回真
#if 如果给定条件为真,则编译下面的代码
#else #if的替代方案
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#errror 遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中
#endif 结束一个#if….#else条件编译块

预定义宏

描述
_DATE_ 当前日期,一个以”MMM DD YYYY”格式表示的字符常量
_TIME_ 当前时间,一个以格式”HH:MM;SS”表示的字符常量
_FILE_ 包含当前文件名,一个字符串常量
_LINE_ 包含当前行号,一个十进制常量
_STDC_ 编译器以ANSI标准编译时,定义为1

预处理器运算符

C 预处理器提供了下列的运算符来帮助您创建宏

a、宏延续运算符(\):宏太长,单行容纳不了。ex:

#define message_for(a,b)     \  printf(#a “and”#b “….”

b、字符串常量化运算符(#):把一个宏的参数转换为字符串常量ex

#include <stdio.h>

#define  message_for(a, b)  \
printf(#a " and " #b ": We love you!\n") int main(void)
{
message_for(Carole, Debra);
return 0;
}

编译运行结果:Carole and Debra: We love you!

c、标记粘贴运算符(##)

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个记

#include<stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void)
{
int
tokenpaster(34);
return 0;
}
编译运行结果:token34 = 40

d、defined()运算符

预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指 定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假。

参数化的宏

ex: #define MAX(x,y) ((x) > (y) ? (x) : (y))
函数直接调用MAX(x,y)即可。


C头文件
如果一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。为了防止这种情况,标准的做法是把文件的整个内容放在条件编译语句中。

#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不同的操作系统上使用的配置参数。您可以通过一系列条件来实现这点
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif

强转

整数提升:整数提升是指把小于 intunsigned int 的整数类型转换为 intunsigned int 的过程(Ascii码的转化)

常用的算术转换

常用的算术转换是隐式地把值强制转换为相同的类型。编译器首先执行整数提升,如果操作数类型不同,则它们会被转换为下列层次中出现的最高层次的类型:

常用的算术转换不适用于赋值运算符、逻辑运算符 && 和 ||

最新文章

  1. 背水一战 Windows 10 (28) - 控件(文本类): TextBox, PasswordBox
  2. sharepoint 2013 入门1_ 建立一个网页程序
  3. 怎么把MVC的Controller拆分写到别的类库
  4. KxMenu下拉菜单
  5. iOS经典面试题
  6. tcp socket
  7. FFT一周目开坑!
  8. apache环境Zf2要装的intl验证
  9. 移植u-boot.2012.04.01
  10. 单点登录系统构建之二——SSO原理及CAS架构
  11. java程序错误类型及异常处理
  12. java_eclipse_svn 与服务器同步时 ,忽略某类型文件和文件夹
  13. 【正常向】CODEVS上分黄金
  14. Unity应用架构设计(11)——一个网络层的构建
  15. Apache服务器安装-apache已经卸载,如何删除注册在系统的服务
  16. openssl-1.1.0g reference
  17. django orm 管理器 objects
  18. java中接口和抽象类的异同点
  19. 存在重复元素(python3)
  20. vue使用axios发送数据请求

热门文章

  1. QML之窗口(无边框、透明及拖拽)
  2. Mysql 索引案例学习
  3. input 类型为number型时,maxlength不生效?
  4. JQUERY1.9学习笔记 之基本过滤器(四) 首元素选择器
  5. 你不知的IE的bug及其解决方案
  6. 运行批处理bat文件不出现黑框
  7. 用TMS的控件就可以了,有bug叫他们改
  8. AC自动机修正
  9. POJ(2784)Buy or Build
  10. [每日一题] OCP1z0-047 :2013-08-05 SELECT语句――列的表达式