理解 x 宏中的文本替换
Understanding the text replacement in x macro
下面的代码解释了 x 宏在 c 编程语言中如何以简单的方式工作
#include <stdio.h>
// Defines four variables.
#define VARIABLES \
X(value1, 1) \
X(value2, 2) \
X(value3, 3) \
X(value4, 4)
// driver program.
int main(void)
{
// Declaration of every variable
// is done through macro.
#define X(value, a) char value[10];
VARIABLES
#undef X
// String values are accepted
// for all variables.
#define X(value, a) scanf("\n%s", value);
VARIABLES
#undef X
// Values are printed.
#define X(value, a) printf("%d) %s\n", a, value);
VARIABLES
#undef X
return 0;
}
形成c中宏的定义。它只是一个文本替换工具。因此编译器将按照以下方式重新创建代码:
#include <stdio.h>
int main(void)
{
char value1[10];
char value2[10];
char value3[10];
char value4[10];
scanf("\n%s", value1);
scanf("\n%s", value2);
scanf("\n%s", value3);
scanf("\n%s", value4);
printf("%d) %s\n", 1, value1);
printf("%d) %s\n", 2, value2);
printf("%d) %s\n", 3, value3);
printf("%d) %s\n", 4, value4);
return 0;
}
预处理器将替换
VARIABLES ------> X(value1, 1) X(value2, 2) X(value3, 3) X(value4, 4)
并将X(value1, 1)替换为char值[10];通过以下方式
X(value1, 1) char value[10];
----- -----
v ^
| |
+--------------------+
//how the code become like this ?
char value1[10];
//why not like this?
char value[10]1;
//or like this?
char value[10];1
//why the macro consider value as the text and place 1 immediately after it?
那么第二个参数1呢,它会被替换成什么吗?
X(value1, 1)
---
^
|
//where is this parameter replaced with
在#define X(value, a)
中,value
和a
是宏参数。如果你传递 X(value1, 1)
那么这些将成为这些宏参数的值,有点像你将参数传递给函数时。
在 #define X(value, a) char value[10];
的情况下,参数 a
未在宏中使用,因此被忽略。
这在使用 X 宏时很常见,您可能有多个值,但只有一些在特定情况下有意义。您仍然需要传递所有参数,但在每个宏中使用它们是可选的。
它就像普通的旧函数一样工作。此功能完全有效:
void foo (int a, int b)
{
printf("%d", a);
}
b
去哪儿了?不行,函数干脆就没有用了
下面的代码解释了 x 宏在 c 编程语言中如何以简单的方式工作
#include <stdio.h>
// Defines four variables.
#define VARIABLES \
X(value1, 1) \
X(value2, 2) \
X(value3, 3) \
X(value4, 4)
// driver program.
int main(void)
{
// Declaration of every variable
// is done through macro.
#define X(value, a) char value[10];
VARIABLES
#undef X
// String values are accepted
// for all variables.
#define X(value, a) scanf("\n%s", value);
VARIABLES
#undef X
// Values are printed.
#define X(value, a) printf("%d) %s\n", a, value);
VARIABLES
#undef X
return 0;
}
形成c中宏的定义。它只是一个文本替换工具。因此编译器将按照以下方式重新创建代码:
#include <stdio.h>
int main(void)
{
char value1[10];
char value2[10];
char value3[10];
char value4[10];
scanf("\n%s", value1);
scanf("\n%s", value2);
scanf("\n%s", value3);
scanf("\n%s", value4);
printf("%d) %s\n", 1, value1);
printf("%d) %s\n", 2, value2);
printf("%d) %s\n", 3, value3);
printf("%d) %s\n", 4, value4);
return 0;
}
预处理器将替换
VARIABLES ------> X(value1, 1) X(value2, 2) X(value3, 3) X(value4, 4)
并将X(value1, 1)替换为char值[10];通过以下方式
X(value1, 1) char value[10];
----- -----
v ^
| |
+--------------------+
//how the code become like this ?
char value1[10];
//why not like this?
char value[10]1;
//or like this?
char value[10];1
//why the macro consider value as the text and place 1 immediately after it?
那么第二个参数1呢,它会被替换成什么吗?
X(value1, 1)
---
^
|
//where is this parameter replaced with
在#define X(value, a)
中,value
和a
是宏参数。如果你传递 X(value1, 1)
那么这些将成为这些宏参数的值,有点像你将参数传递给函数时。
在 #define X(value, a) char value[10];
的情况下,参数 a
未在宏中使用,因此被忽略。
这在使用 X 宏时很常见,您可能有多个值,但只有一些在特定情况下有意义。您仍然需要传递所有参数,但在每个宏中使用它们是可选的。
它就像普通的旧函数一样工作。此功能完全有效:
void foo (int a, int b)
{
printf("%d", a);
}
b
去哪儿了?不行,函数干脆就没有用了