美文网首页
#define讲解

#define讲解

作者: 小阿牛的爸爸 | 来源:发表于2021-10-14 10:18 被阅读0次

#define通常有以下几方面用途:

1. 定义常量

类似于java的static final 以及 c++的const。不过通过#define定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

语法:

#define  标识符  常量

示例:

#define PI 3.14

定义常量有什么好处呢,就是如果常量的值发生变化的时候,我们不需要到各个使用的地方去修改这个值,只需要在定义的地方修改一次就好了。

2. 定义函数

这里与其说是定义函数,不如说是定义字符串常量。其实就是用一个符号名来替代一行或多行函数语句,在实际编译的过程中再用实际的函数语句去替换符号名。

在#define定义函数的时候并不会检查报错,因为对define来说,就是定义一串字符串嘛,所以不存在错误一说。在实际使用这段定义的函数中是否会出错,直接把这段函数拷贝到使用处看看就知道了。

2.1 单行函数举例

如下,我定义了MAX(a, b)和PRINT_HELLO(a)两个函数。

#define MAX(a,b) a > b ? a : b

#define PRINT_HELLO(a) printf("hello %s\n", a)

int main(int argc, char *argv[])

{    

    // 输出最大值2。如果想知道这里能不能用上面两个函数,直接把其对应的字符串拷贝过来

    // 很明显, PRINT_HELLO(a)拷贝过来之后就变成了 printf("%d\n",  printf("hello %s\n", a) ); 这明显是错误的

    printf("%d\n", MAX(1, 2));

  // 输出hello world

    PRINT_HELLO("world");

}

2.2 多行函数举例

在定义多行函数的时候,可以把多行函数写在一行,也可以用换行符写在多行。

#define PRINT_HELLO(a) { printf("hello %s\n", a);printf("input param is %s\n", a);}

#define PRINT_HELLO_MULTI(a) {             \

    printf("hello %s\n", a);               \ 

   printf("input param is %s\n", a);      \

    }

int main(int argc, char *argv[]){

    printf("%d\n", MAX(1, 2));

    PRINT_HELLO("world");

    PRINT_HELLO("world");

}

3. 特殊语法##和#

#define中支持拼接变量。如下,Conn(str)的结果是MyName在拼上变量str

#define Conn(str) MyName##str

#是用来取宏定义中传入的变量的。

#define Conn(a) void plusFunc() { printf("%s\n", #a); }

// 把Conn代表的字符串替换到这里就能看出来,这里其实相当于定义了一个函数plusFunc

Conn(abc);

int main()

{

    // 这里调用刚才创建的函数

    plusFunc();

    return0;

}

相关文章

网友评论

      本文标题:#define讲解

      本文链接:https://www.haomeiwen.com/subject/zaguoltx.html