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
强转
整数提升:整数提升是指把小于 int 或 unsigned int 的整数类型转换为 int 或 unsigned int 的过程(Ascii码的转化)
常用的算术转换不适用于赋值运算符、逻辑运算符 && 和 ||
转载于:https://www.cnblogs.com/wrs9527/p/4910050.html
相关资源:匠人手记-完整版.zip