宏、预编译(day12)

指针数组里的每个存储区是一个指针类型
    的存储区
字符指针数组里包含多个字符类型指针,其中
    每个指针可以表示一个字符串
字符指针数组可以用来表示多个相关字符串

主函数的第二个参数是一个字符指针数组,
   其中每个指针代表一个字符串,所有
   这些字符串的内容都来自于用户的命令
主函数的第一个参数是一个整数,它表示
    第二个参数里的指针个数

#define预处理指令可以用来定义宏

宏可以用来给数字起名字
定义宏的时候要把宏名称写在#define预处理
    指令后,宏名称后写它所代表的数字
宏名称通常由大写英文字母构成
宏名称里不可以包含空格
用宏给数字起名字的时候不可以使用赋值
    操作符
可以在程序里使用宏名称代表它所对应的数字,
   编译器会把程序里的所有宏名称替换成
   它所代表的数字

可以在编译命令里使用-D选项临时指定
   宏所代表的数字

宏还可以给一个计算公式起名字
计算公式里包含未知数字,宏的参数用来
   表示这些未知数字

编译器采用二次替换的方式处理带参数的宏

宏的参数不一定代表数字,所以它没有类型
如果宏有多个参数就需要用逗号把他们分开

宏不可以使用自己的存储区和函数进行数据
    传递
宏没有形式参数也没有用来存放返回值的
    存储区

能当作数字使用的宏必须编写成一个表达式
    (因为宏没有用来记录返回值的存储区)

宏的参数直接代表函数的存储区,在宏里对
    参数内容的修改可以直接影响函数

因为宏没有用来记录返回值的存储区,所以
   不能保证优先计算宏里面的操作符
所有能当作数字使用的宏必须写在一对小括号
   里面

宏没有形式参数所以不能保证优先计算参数
    里面的操作符
编写宏的时候所有能当做数字使用的参数也都
   必须写在小括号里面

不要把自增或自减的结果作为宏的参数使用

编写宏的时候可以使用一些特殊的符号,它们
    叫做宏操作符

#是一个宏操作符,它可以把宏的参数转换
    成字符串字面值
##也是一个宏操作符,它可以把一个代表
     标识符的参数和其他内容连接得到
     一个新的标识符

条件编译可以在编译的时候从几组语句里
    选择一组编译而忽略其他组
#ifdef/#ifndef...#else...#endif
以上结构可以根据一个宏名称是否被定义过
    从两组语句中选择一组编译
最开始的预处理指令应该从两个里选择一个,
    它们的后面都要跟着一个宏名称
如果选择#ifdef就表示它后面的宏名称被定义
    过就编译前一组语句,否则编译后一组
    语句 
如果选择#ifndef就刚好相反

#if...#elif(任意多次)...#else...#endif
这个结构也可以实现条件编译,它可以根据
    任意逻辑表达式从多组语句中选择一组
    编译
原文地址:https://www.cnblogs.com/Kernel001/p/7735181.html