预处理详解

目录

一:预定义符号

二.#define 定义标识符

三.#define 定义宏

四.#undef 除宏定义

 五.条件编译

六.文件包含


一:预定义符号

__FILE__       // 进行编译的源文件
__LINE__     // 文件当前的行号
__DATE__     // 文件被编译的日期
__TIME__     // 文件被编译的时间
__STDC__     // 如果编译器遵循 ANSI C ,其值为 1 ,否则未定义
int main()
{printf("%d\n",__FILE__);
    printf("%d\n",__DATE__);
    printf("%d\n",__LINE__);
    printf("%d\n",__TIME__);
    printf("%d\n",__STDC__);
        return 0;
}

 

如果__STDC__报错,那么便是不支持ANSI C,还有很多类似的预处理命令

 

二.#define 定义标识符

1.语法:

#define name stuff

2.用法:

#define MAX 1000
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                         date:%s\ttime:%s\n" ,\
                         __FILE__,__LINE__ ,       \
                         __DATE__,__TIME__ )  

提醒:使用#define的时候最后最好不要加上;可能引起;;问题,如:

#define M 15;
int main()
{
int a=M;//这样编译器就会报错 在预处理阶段此语会被替换为int a=15;;
return 0;
}

三.#define 定义宏

#defifine 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏( macro )或定义宏( defifine
macro )。

1.声明方式:

#define name( parament - list ) stuff
注意:name的后面的(与name要紧挨着
#define ADD(a,b) ((a)+(b))
int main()
{int a=ADD(1,2);
return 0;
}  

注意:1.同时为了避免未知的错误应不吝啬括号

           2. 宏不建议使用带有副作用的参数,如(a++)

2.#和##

(1).# 把宏参数转变成字符串

#define MAX(n) #n
int main()
{char*p=MAX(1111);
    printf("%s",MAX(1111));
}

成功打印1111 

int i = 10;
#define PRINT(FORMAT, VALUE)\
printf("the value of " #VALUE "is "FORMAT "\n", VALUE);//将VALUE的值变成字符串
int main(){
PRINT("%d", i+3);

(2).## 将两边的数之间连接成一个数(必须在定义宏的时候使用,且两边的宏参数不能带括号)

#define MAX(a,b) a##b
int main(){
printf("%d",MAX(1,2));
 }

 

3.宏的缺点:

(1.每次使用宏时会插入一份宏定义1点代码,所以宏不能太长,不然可能大幅度增加程序长度

2.真正执行的代码与调试时的所看到的代码不同,不能调试

3.宏由于类型无关,不够严谨

4.宏可能回带来运行优先级的问题,容易出错

注:宏可以做到的函数可能做不到,宏和函数各有优劣

4.命名约定

(1).宏名全大写(有例外,如offsetof)

(2).函数名不要全大写

四.#undef 除宏定义

这条指令用于移除一个宏定义
#undef NAME 

 五.条件编译

条件编译指令

1.
#if 常量表达式
//...
#endif
// 常量表达式由预处理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__
//..
#endif
2. 多个分支的条件编译
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif
3. 判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4. 嵌套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif

六.文件包含

1.防止头文件被重复调用的方法

每个头文件这么写

#ifndef __TEST_H__ 
#define __TEST_H__ 
//头文件的内容
#endif //__TEST_H__

或者

#pragma once

2.头文件包含

(1)." "在目标目录底下查找

(2).< >在库函数目录底下查找

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值