C语言学习第十六课(预编译指令)

第十六课

1,预定义符号
符号含义
__ FILE __进行预编译的文件名
__ LINE ____ LINE __所在的行号
__ DATA __文件被编译的日期
__ TIME __文件被编译的时间
__ FUNCTION __所在函数的函数名
2,#define宏定义

1,定义方式:#define 标识符 替换数值

3,带参宏

1,定义方式:#define name(参数列表) stuff

例子:
    #define Fun(x) x*x
    Fun(3);//替换为3*3
4,带参宏与函数

1,带参宏常用于执行简单的计算

例子:
    #define MAX(a,b) ((a)>(b)?(a):(b));//比较大小

2,一些函数无法完成的功能

例子://函数无法传参数为类型的
    #define MALLOC(type,size) (type*)malloc(sizeof(type)*size)
  //或者:#define CALLOC(n,type) calloc(n,sizeof(type))//将类型参数化  
    int *p=MALLOC(int,9);
    #define FOE(i) for(int i=0;i<10;i++)
    FOR(i)
    {
        *(p+i)=i;
    }

5,宏和函数的区别
属性#define宏函数
代码长度每次使用时,宏代码都被插入到程序中,除了非常小之外,程序的长度将大幅度增长函数代码只出现于一个地方,每次使用这个函数时,都调用那个地方的同一份代码
执行速度更快存在函数调用/返回的额外开销
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非它们加上括号,否则邻近操作符的优先级可能会产生不可预料的结果;函数参数只在函数调用时求值一次,它的结果值传递给函数。表达式的求值结果更容易预测
参数类型宏与类型无关,只要对参数的操作是合法的,它可以使用于任何参数类型;函数的参数是与类型有关的。如果参数的类型不同,就需要使用不同的函数,即使它们执行的任务是相同的;
6,#undef

该预处理指令用于移除一个宏定义,如果一个现存的名字需要被重新定义,那么它的旧定义首先必须用#undef移除;

例子:
#define Pi 3.14
#undef Pi //取消Pi的定义
double i=Pi;//error
7,#和##

1,字符串化操作符#:用在宏定义中,表示把参数字符串化,将一个参数转换成字符串;

#define Str(s) #s
printf("%s",Str(fafa));//输出fafa

2,符号连接操作符##:是连接符,连接两个参数成为一个标识符;

#define Link(i) n##i
int Link(9)=666;
printf("%d",n9);//输出666;

3,字符化操作符#@:只能用于传入参数的宏定义中,且必须置于宏定义体的参数名前,作用是将传入的单字符参数名转换成字符,用一对单引号括起来;

#define Charc(c) #@c
putchar(Charc(6));//输出6;
8,条件编译

1,满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

2,三种形式

1,#ifdef
  定义:
  #ifdef 标识符 (或 #if defined 标识符)
    程序段1#else
    程序段2#endif
注意:如果标识符已经被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译;
没有程序段2则可以写:
    #ifdef 标识符
       程序段;
    #endif
2,#ifndef 
    定义:
    #ifndef 标识符 (或if !(defined 标识符))
         程序段1#else 
         程序段2;
注意:如果标识符已经被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译   
3,#if
    定义:
    #if 常量表达式
        程序段1#else
        程序段2#endif
注意:如果常量表达式的值为真(0),则对1编译,否则对2编译;
9,#error
#error :输出用户自定义的错误信息
  例子:
    #ifndef __cplusplus //判断是不是C++文件
    #error place used C++//报错误信息(自己书写的)
    #endif //! __cplusplus
10,#include文件包括

1,标准库文件

·形式:#include < filename>

2,本地文件

形式:#include”filename”

11,头文件宏定义
1,宏定义时,全部转成大写,中间用_分开;
    例子:
    #define _STDIO_H_
12,hpp文件
.h结尾—头文件类型的定义,函数的声明
.c结尾----源文件变量的定义,函数的实现
hpp结尾头文件和源文件放在一个文件里面
13,#pragma

概念: 设定编译器的状态或者是指示编译器完成一些特定的动作;

1,#pragma message(“消息文本”);

·当编译器遇到这条指令时,就在编译输出窗口中将消息文本打印出来;

2,#pragma once

`在头文件的最开始加入这条指令,就能够保证头文件被编译一次;

3,#pragma waring(command : 错误代码)

·设置警告信息状态

·disable:1230 //屏蔽1230号警告信息;

·once: 1230 //仅报告一次1230号警告信息;

·error: 1230 //把1230号警告信息作为一个错误;

4,#pragma comment(comment-type,”commentString”)

·comment-type :是一个预定义的标识符,指定注释的类型,一般用来加载静态库;

·commentString : 是一个为comment-type提供附加信息的字符串;

5,#pragma pack(指定对齐长度)

·指定对齐长度:用在结构体,联合体之中;

规则://自定的大于最宽数据类型,则按照最宽的数据类型对齐
     //自定的小于最宽的数据类型,则按照指定的字节对齐;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值