C复习手记(Day3)

it2024-10-14  21

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
最新回复(0)