c - 了解 x 宏中的文本替换
问题描述
下面的代码解释了 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 value[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
?无处,该功能根本没有使用它。
推荐阅读
- linux-kernel - 使用 IOMMU,为什么我们不必固定 DMA 缓冲区页面?
- redux - 按名称而不是索引从 redux 表单字段数组中删除项目
- typescript - 使用以 T 为条件的其他类型的类型断言来推断类型 T
- prometheus - 有没有办法将一个指标与 PromQL 中的所有其他指标结合起来?
- c# - 将文件从一个 Zip 文件复制到另一个
- reactjs - 在构建带有选项卡的表时,我正在寻找一种更好的方式来构建 Apollo 客户端查询
- sql - SQL 不同行中的不同空值
- c++ - 将继承的类添加到已定义的类型
- python - 过滤 numpy 数组中的特定列
- r - toJSON 转换问题