C语言23 终极篇 预处理之宏定义、条件编译和文件包含

admin 2018年5月13日03:37:15评论514 views字数 1920阅读6分24秒阅读模式
摘要

预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。


什么是预处理

预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。

预处理功能主要包括宏定义,文件包含,条件编译三部分

宏定义

简单宏: #define 标识符 字符序列

#define FALSE 0 #define NAME "LUODAOYI" #define __IN #define __OUT   //极端例子  #define NAME "LUODAOYI" #define A int method() { #define B char buffer[0x10]; #define C strcpy(buffer,NAME); #define D return 0;} #define E method();  //使用 A B C D  int main() {     E     return 0; }

带参数的宏 #define 标识符(参数表) 字符序列

#define MAX(A,B)((A)>(B)?(A):(B))  int method() {     int x = 1;     int y = 2;     int z = MAX(x,y);     return 0; }  // 多行定义 // '/' 后不可有空格 #define A for(int i=0;i<length;i++)/ {/     printf("%d /n",arr[i]);/ }/  int method(int arr[],int length) {      A      return 0; } int main() {     int arr[] = {1,2,3,4,5,6,7,8,9,0};     method(arr,10); }  //直接使用宏定义函数 #define MYPRINT(X,Y) for(int i=0;i<(Y);i++)/ {/     printf("%d /n",(X)[i]);/ }/ return 0;/  int main() {     int arr[] = {1,2,3,4,5,6,7,8,9,0};     MYPRINT(arr,10); }  //使用宏定义函数和普通函数的区别 // 使用宏比较节省空间 因为使用宏定义函数 没有堆栈提升操作,也就是不会作为函数调用而是直接内联到代码内

宏定义的注意事项:

  1. 只作字符序列的替换工作,不做任何语法检测,在编译前处理。
  2. 宏名标识符与左圆括号之前不允许有空白符,应紧接在一起。
  3. 为了避免出错,宏定义中给形参加上括号
  4. 多行声明时,回车换行前要加上字符'',即 '[enter]',主意字符''后要紧跟回车键,中间不能有空格或其他字符
  5. 末尾不需要分号

条件编译与文件包含

什么是条件编译

查看下面代码的反汇编

#include "stdafx.h"  int main(int argc,char* argv[]) { #if 0     printf("--------") #endif     return 0; }    //应用场景 #include "stdafx.h"  #define DEBUG 0  int main(int argc,char* argv[]) { #if DEBUG     printf("--------") #endif     return 0; }

预处理指令:条件编译时通过预处理指令实现的

指令 用途
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#endif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#else 同else
#endif 结束一个#if…#else条件编译块
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#include 包含文件

多条件条件编译例子

#define A  int main(int argc, char* argv[]) {  #if define A     printf("-----------1 /n"); #elif define B     printf("-----------2 /n"); #else     printf("-----------3 /n"); #endif      return 0; }

预处理指令举例

#undef TRUE //取消true定义 #define TRUE 1 //定义TRUE  #if defined a   //如果a定义了 #undef a        //解除A的定义 #define a 200   //重新定义a #endif          //结束#IF  #ifndef a       //如果a没有定义 #define a 100   //定义a #endif          //结束#IF  #ifdef a        //如果定义了a #define b 100   //定义b #endif          //结束#IF

文件包含

文件包含有两种格式

分辨是 #include "file"#include <file>

  1. 使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的"包含文件目录"(由用户在配置环境时设置)去找
  2. 使用尖括号:直接到系统指定的“包含文件目录”去查找

总结:

  • 系统文件用 <>
  • 自己定义的文件用 ""

重复包含

pass

如何解决重复包含问题?

  1. 条件编译
  2. 前置声明

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2018年5月13日03:37:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   C语言23 终极篇 预处理之宏定义、条件编译和文件包含https://cn-sec.com/archives/51517.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息