C预编译处理

C语言预编译处理包含三个方面,宏定义,与及条件编译,文件包含

1.宏定义

解析:用一个指定的标志符来代表一个字符串

#define PI 3.141592653

无参数宏定义

  1. 无参数
  2. 一般大写
  3. 有得于统一替换(直接修改数值,所有地方都跟着修改)
  4. 末尾不能加分号(比如#define PI 3.141592653;  程序中 float area = PI*3*3;宏展开得到结果:float area = 3.141592653;*3*3,编译报错)
  5. 可以层层替换(宏可以使用之前已定义的宏)
  6. ""号内不转换(printf("PI is a float numer:");语句中的PI在引号""中,不进行宏展开)
  7. 只作字符替换,不分配空间(相对于变量)

带参数宏定义

#define ADD(a, b) a+b
  1. 对参数字符作统一替换
  2. 宏名与括号不能加空格
  3. 统一替换要注意出错,如#define AREA(r) 3.14*r*r/2原意是得到圆的面积,AREA(a+b)宏展开结果:3.14*a+b*a+b/2,与预期不符合,所以得在r上加括号#define AREA(r) 3.14*(r)*(r)/2

#与##

  宏定义中,#表示将两个字符串相连,可以理解为在宏两边加上引号:

#include <stdio.h>
#define PRINT(w,h) printf("Your input is " #w #h "\n");
int main(int argc, char* args[]) {
        PRINT(3,4);return 0;
}

输出结果为:

Your input is 34

带#号参数的宏在展开后得到的结果是:

printf("Your input is " "3" "4" "\n");

##表示该参数是一个变量的一部分

#include <stdio.h>
#define PRINT(w,h) printf("Your input is" #w #h "df\n");
#define VAR_PRE(name) var_##name
int main(int argc, char* args[]) {
        PRINT(3,4);        
        int VAR_PRE(count) = 5;
        printf("%d\n", VAR_PRE(count));
        return 0;
}

##将name参数与var_结合,相当于往count变量赶回前缀,以区分不同的类别

可变参数...

C++宏定义中的可变参数表示是...,在宏定义中访问该参数的方法是__VA_ARGS__

#include <stdio.h>
#define PRINT_ALL(...) printf(#__VA_ARGS__ "\n")
int main(int argc, char* args[]) {
        PRINT_ALL(A, B, C);
        return 0;
}

输出结果为:A, B, C

单独访问具体的某一参数(这个暂时未看到方法)

2.条件编译

条件编译用告诉编译器,某些代码不用编译,经常使用它来避免重复编译:

// common.h

  #ifndef COMMON_H

  #define COMMON_H

  class Circle {

  public:
    string r;
  };

  #endif

场景是多处包含common.h文件,#ifndef避免编译器对common.h进行多次编译

3.文件包含

  #include

  1.  一次只能引入一个文件
  2. <stdio.h>和"common.h"的不同点是<>只在标准库里面查找,common.h除了在标准库查找外,还在用户指定的PATH路径进行查找编译

4.宏定义的两个用户

//1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
//2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */

参考资料:

http://www.360doc.com/content/08/0324/11/59579_1140684.shtml

http://www.360doc.com/content/09/1009/16/59579_7027058.shtml

原文地址:https://www.cnblogs.com/haiyupeter/p/2665146.html