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

  1. #include <stdio.h>
  2.  
  3. #define message_for(a, b) \
  4. printf(#a " and " #b ": We love you!\n")
  5.  
  6. int main(void)
  7. {
  8. message_for(Carole, Debra);
  9. return 0;
  10. }

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

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

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

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

d、defined()运算符

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

参数化的宏

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


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

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

强转

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

常用的算术转换

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

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

C复习手记(Day3)的更多相关文章

  1. C复习手记(Day4)

    1.C错误处理 errno.perror() 和sterror() perror() 函数显示您传给它的字符串,后跟一个冒号.一个空格和当前 errno 值的文本表示形式. strerror() 函数 ...

  2. C复习手记(Day2)

    1.共用体 共用体是一种特殊的结构,允许在相同的位置存储不同的数据类型.可以定义一个带有多成员的共同体,但是任何时候只能有一个成员带有值. 定义共用体: union Data { int i; flo ...

  3. C复习手记(Day1)

    auto存储类:所有局部变量默认的存储类  ex:{int mount;auto int month}  auto只用在函数内,只做局部变量 register 存储类:register 存储类用于定义 ...

  4. ROS学习手记 9 -- 阶段性复习

    ROS 阶段性总结 1. 基本概念 ROS 是建立在Linux特别是Ubuntu系统上的一套软件系统,它具有操作系统的特征 ,负责管理各个模块的协同运行.设计初衷主要是面向机器人软硬件开发的特点:多 ...

  5. 复习JavaScript随手记

    数据类型 基本类型 string number boolean undefined number类型,包含整数浮点数 NaN和自己都不相等,涉及NaN的计算结果都是NaN isNaN()函数用于判断一 ...

  6. Knockout.js随手记(2)

    计算属性 konckout.js的API文档,写的极为详细和生动,透过MVVM的运作原理,开发时只需专注于定义ViewModel逻辑,不需耗费心力处理TextBox.Select的onchange.o ...

  7. Day3 /2-4.10!一天水完毕设,焦虑略减,flag不能倒!

    PS:毕设略水,接下来两周要找到生活规律,竹径以后抓紧深化毕设(4.16开始),周六出去玩一天吧,这就需要明天把图彻底分好!!!明天有点小期待,今天把Day3补更完,明天原本应该是Day4的,但是打算 ...

  8. ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters

    上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameters 我不理解为何 ROS wiki 要把service与parameter放在一起介绍, 很想分 ...

  9. bjwc Day3 & 4 妈妈我这是来了个什么地方呀

    真·bjwc开始了 Day3 T1啥啥啥 第k大斜率?想都没想码了个暴力,然后爆零...暴力都能错,退役 T2看着像网络流就扔了个网络流大暴力上去,六七十分的样子然后蜜汁wa T3题面说“想都没想就弄 ...

随机推荐

  1. windows下安装mysql笔记

    接着上几篇文章再来看下windows下安装mysql. 我这里是windows7 64位, 安装过程中还是遇到一些坑,这里记录下. 一.下载安装包 打开mysql官网下载页面:http://dev.m ...

  2. Spring Boot Web项目之参数绑定

    一.@RequestParam 这个注解用来绑定单个请求数据,既可以是url中的参数,也可以是表单提交的参数和上传的文件 它有三个属性,value用于设置参数名,defaultValue用于对参数设置 ...

  3. Oracle数据库之事务

    Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...

  4. GetWindowText

    用于得到窗口中的数据 {// TODO: If this is a RICHEDIT control, the control will not// send this notification un ...

  5. IE6-BUG-CSS兼容详解

    1.IE6背景闪烁 如果你给链接.按钮用CSS sprites作为背景,你可能会发现在IE6下会有背景图闪烁的现象.造成这个的原因是由于IE6没有将背景图缓存,每次触发hover的时候都会重新加载,可 ...

  6. postgres安装 以及修改postgres 密码

    #postgres安装 apt-get install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 postgresql-s ...

  7. var genreModel =storeDB.Genres.Include("Albums").Single(g => g.Name == genre);是什么意思?

    g => g.Name == genre代表一个匿名函数.即这里向Single方法传入了一个方法类型的参数. =>左边的g代表方法的参数,可以有多个,如(g,f) => ...,=& ...

  8. Ftp协议Socket实现

    原来用WebRequest来传输文件,被人鄙视了.就弄个Socket版的,支持Active,Passive模式. 带事件日志,有时间的人可以拿去做C#版的flashfxp. public class ...

  9. 转:40多个关于人脸检测/识别的API、库和软件

    文章来自于:http://blog.jobbole.com/45936/ 自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议.我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中 ...

  10. C/C++跨平台的的预编译宏

    我们在编译一些跨平台的程序的时候难免会遇到_WIN32  __linux__什么之类的SDK或者编译器环境预定义的宏.有很多,之前还分不清_WIN32 和WIN32的区别.不过这里还好有个列表,做个备 ...