• C语言讲义——预处理


    C预处理器是一个文本替换工具,在实际编译之前完成一些预先的处理。
    C预处理器(C Preprocessor)简写为 CPP
    预处理器命令都是以#开头,如:

    #include <stdio.h>
    包含源代码文件stdio.h
    

    #define定义宏

    1. 代码文本替换
    2. 增强可读性
    #define MAX_ARRAY_LENGTH 20
    main () {
    	/*
    	*把所有的MAX_ARRAY_LENGTH 替换为20
    	*#define:增强可读性
    	*/
    	char a1[MAX_ARRAY_LENGTH];
    	char a2[MAX_ARRAY_LENGTH];
    	char a3[20];
    }
    

    系统提供的预定义宏

    DATE 当前日期 字符串常量
    TIME 当前时间 字符串常量
    FILE 当前文件名 字符串常量
    LINE 当前行号 十进制数字常量
    puts(__DATE__);
    puts(__TIME__);
    puts(__FILE__);
    printf("%d",__LINE__);
    

    条件编译

    • 定义一个非0的宏
    #include <stdio.h>
    #define DEBUG 1
    main(void) {
    #if DEBUG
    	printf("Debug模式");
    #else
    	printf("Release模式");
    #endif
    }
    
    • defined:专用于预处理器的运算符,只要定义无需具体内容
    #include <stdio.h>
    #define DEBUG
    main(void) {
    #if defined(DEBUG)
    	printf("Debug模式");
    #else
    	printf("Release模式");
    #endif
    }
    

    #undef取消已定义的宏

    带参数的宏

    • 带参数的宏经常用来作为简单的函数使用。
    • 宏名字和左括号间必须没有空格。
    • 比函数速度稍微快一些(函数需要存储上下文信息、复制参数值等)。
    • 宏参数没有类型,更通用。
    • 每次调用宏都有代码替换,编译后代码会变大。
    #include <stdio.h>
    #define MAX(x,y) (x>y?x:y)
    main(void) {
    	int i  = MAX(1,2);
    	// →int i = (1>2?1:2);
    	printf("%d",i);
    }
    
    #include <stdio.h>
    #define IS_EVEN(n) (n%2==0)
    main(void) {
    	int i  = IS_EVEN(20);
    	// →int i = (20%2==0);
    	printf("%d
    ",i);
    	int j  = IS_EVEN(21);
    	// →int i = (21%2==0);
    	printf("%d
    ",j);
    }
    

    *字符串常量化(#)

    #include <stdio.h>
    #define  func(a) printf("我乃是")
    int  main(void) {
    	func("五百年前大闹天宫的齐天大圣");
    	return 0;
    }
    
    #include <stdio.h>
    #define  func(a) printf("我乃是"#a)
    int  main(void) {
    	func(五百年前大闹天宫的齐天大圣);
    	return 0;
    }
    

    宏换行()

    #include <stdio.h>
    #define func(a) 
    	printf("我乃是"#a)
    int main(void) {
    	func(五百年前大闹天宫的齐天大圣);
    	return 0;
    }
    

    *标记粘贴运算符(##)

    • 将两个标记“粘合”在一起。
      如:MAX函数,只能用于某一特定的类型,如果既要适用于int,又要适用于float,就需要定义两个函数,函数体完全一样。如果还要再适用于long,double等,重复代码将会更多。
    #include <stdio.h>
    int  int_max(int x,int y) {
    	return x>y?x:y;
    }
    float  float_max(float x,float y) {
    	return x>y?x:y;
    }
    main(void) {
    	printf("%d
    ",int_max(1,2));
    	printf("%f
    ",float_max(1.2,2.3));
    }
    
    #include <stdio.h>
    #define GENERIC_MAX(t) 
    	t t##_max(t x,t y)
    	{
    		return x>y?x:y;
    	}
    GENERIC_MAX(int);
    GENERIC_MAX(float);
    main(void) {
    	printf("%d
    ",int_max(1,2));
    	printf("%f
    ",float_max(1.2,2.3));
    }
    
  • 相关阅读:
    数据库设计 概念结构设计(以权限系统为例)
    sp_addlinkedserver使用方法
    动态页面静态化技术(很不错的教程摘录)
    C#获取硬件序列号
    [转]消息队列关于MSMQ的基础知识
    通过Image对象获取对象的格式
    历史项目的回忆 2008.04.27
    解决Access to Message Queuing system is denied.权限问题
    windows 输入法生成器 导出输入法的mb文件到txt
    [转载]C#版可调节的文字阴影特效
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11191687.html
Copyright © 2020-2023  润新知