欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#define的用法

程序员文章站 2024-03-23 11:40:28
...

#define(宏定义),C语言中预处理命令一种。在预处理过程中进行简单字符串替换,不做正确性检查。

  1. define字面量定义。

    #define NUM (10)
    #define NUM2 (NUM+NUM)
    

    可以使用 const 常量替代。

  2. 带参宏

    #define PRINTINT(x) printf("%d\n", x);
    

    这不是函数!在编译前会有预处理程序进行只是简单的字符串替换。
    可以使用 inline 替换。

  3. 类型定义

    #define LL long long
    

    可以用typedef,using 替换。

  4. 宏的单行定义(##,#@,#的用法)
    ##x --> x
    #@x --> ‘x’ (Microsoft Specific)
    #x --> “x”

    举个例子:

    /// @author zhaolu
    
    #define PRINT(x) printf("%d %s %d\n", x, #x, v##x)
    #define A(x) (#x[0]) 
    #define B(x) *#x
    int main()
    {
        int v2 = 22;
        PRINT(2);
        printf("%d\n", A(a4));
    	printf("%d\n", B(B));
        return 0;
    }
    

    输出结果为:

    2 2 22
    97
    66
    
  5. define的多行定义
    当define宏定义不能用一行写完时,在尾部加上\,可以继续在下一行定义。

    #define PRINT_HELLO printf("h	\
    e\
        l\
    l\
    o\n")
    
    #define PRINT_ONE_TO_TEN() for(int i = 1; i <= 10; ++i) {\
        printf("%d ",i);\
    }
    	
    int main()
    {
    	PRINT_HELLO;
        PRINT_ONE_TO_TEN();
    	return 0;
    }
    

    输出结果为:

    h    e    llo
    1 2 3 4 5 6 7 8 9 10 
    
  6. 条件编译,在跨平台和系统的软件中,使用define可以实现条件编译。

    #ifdef WINDOWS
    //...windows code
    #endif
    #ifdef LINUX
    //...linux code
    #endif
    
  7. 防止头文件被重复包含

    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    //...声明语句
    #endif
    

    可以使用pragma once替换。
    可以参考:https://blog.csdn.net/LU_ZHAO/article/details/104221956

  8. 定义宏和取消宏

    #define LU_ZHAO
    //...code
    #undef LU_ZHAO
    
  9. ANSI标准中说明了五个预定义的宏名:
    __ LINE __:程序的当前行数
    __ FILE __ :程序的名称
    __ DATE __ :宏指令包含程序编译的时间。时间用字符串表示,其形式为:分:秒
    __ TIME __ :源文件被翻译到代码时的日期,形式为月/日/年的字符串串
    __ STDC __:如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。

  10. __ VA_ARGS __
    用来接受不定数量的参数。
    举个例子:

    #define BUFFER_SIZE (2048)
    char buffer[BUFFER_SIZE];
    #define SPRINT(...) sprintf(buffer, __VA_ARGS__)
    
    int main()
    {
        SPRINT("zhaolu");
        printf("%s", buffer);
        return 0;
    }
    

    当__VA_ARGS__宏前面##时,可以省略参数输入。
    举个例子:

    #define BUFFER_SIZE (2048)
    char buffer[BUFFER_SIZE];
    #define SPRINT(format, ...) sprintf(buffer,format, ##__VA_ARGS__)
    
    int main()
    {
        SPRINT("zhaolu");
        printf("%s", buffer);
        return 0;
    }
    
相关标签: C/C++