zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Firefly是什么?有什么特点?
    windows7下启动mysql服务出现服务名无效
    win7系统64位eclipse环境超详细暗黑1.4服务器搭建
    Python安装模块出错(ImportError: No module named setuptools)解决方法
    Error format not a string literal and no format arguments解决方案
    DropFileName = "svchost.exe" 问题解决方案
    javascript
    Javascript
    PHP 命名空间namespace 和 use
    css
  • 原文地址:https://www.cnblogs.com/haiyupeter/p/2665146.html
Copyright © 2011-2022 走看看