1、宏定义

定义

  • 凡是以“#”开头的均为预处理命令
  • define为宏定义命令,无需分号结尾
  • 先由预处理程序进行宏代换,用3.1415926置换所有的宏名PI,再进行编译
  • 仅仅是替换,在预处理阶段完成
    1. #define PI 3.1415926

    注销

    ```java

    include

define PI 3.1415926

undef PI

int main() { // 此处报错 printf(“%g\n”,PI); return 0; }

  1. <a name="qBFvk"></a>
  2. #### 宏嵌套
  3. ```java
  4. #include <stdio.h>
  5. #define PI 3.1415926
  6. #define S PI*r*r
  7. int main()
  8. {
  9. int r = 4;
  10. double area = S;
  11. printf("%f",area);
  12. return 0;
  13. }

带参宏定义

  • 基本使用
  • 只是符号替换,不存在值传递的问题 ```java

    define M(x) x*x+5

int main() { int k = M(5);
printf(“%d\n”,k);

return 0;

}


- 参数可以是表达式,参数最好加括号,防止替换后导致其他问题
```java
#include <stdio.h>

#define M(x) (x)*(x)

int main()
{
    int a = 2;
    int k = M(a+2); // (a+2)*(a+2) = 16
    printf("%d\n",k);

    return 0;
}

#define M(x) x*x

int main()
{
    int a = 2;
    int k = M(a+2); // a+2*a+2 = 8
    printf("%d\n",k);

    return 0;
}

2、typedef

  • typedef在编译时处理,不是简单的替换,而是对类型说明符重新命名 ```java

    include

define D1 char*

typedef char* D2;

int main() { // 最终是char a,char b D1 a,b; // 最终是char x,char* y D2 x,y;

// 8 1 指针长度8个字节
printf("%d %d\n",sizeof(a),sizeof(b));
// 8 8
printf("%d %d",sizeof(x),sizeof(y));

return 0;

}

<a name="xguT3"></a>
### 3、include两种方式

- 两种方式
   - "":去用户设置的文件目录去查找
   - <>:去源文件目录去查找
```java
#include "stdio.h"
#include <stdio.h>

4、条件编译

  • ifdef

  • ifndef

    ```java

    include

define PI 3.14

int main() {

ifdef PI

printf("have PI\n");

else

printf("no PI\n");

endif

ifndef PI

printf("no PI\n");

else

printf("have PI\n");

endif

return 0;

}


- #if
```java
#if 0
    printf("11");
#else
    printf("22");
#endif