C 理解x宏中的文本替换
下面的代码解释了x宏如何在c编程语言中以简单的方式工作C 理解x宏中的文本替换,c,c-preprocessor,x-macros,C,C Preprocessor,X Macros,下面的代码解释了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 eve
#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;
}
它将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
在#定义X(值,a)
中,值
和a
是宏参数。如果您传递X(value1,1)
,那么这些将成为这些宏参数的值,就像将参数传递给函数一样
对于#定义X(值,a)字符值[10]
,宏中未使用参数a
,因此将忽略该参数
这在使用X宏时很常见,您可能有几个值,但只有一些值在特定情况下有意义。您仍然需要传递所有参数,但在每个宏中使用它们是可选的
它就像普通的旧函数一样工作。此函数完全有效:
void foo (int a, int b)
{
printf("%d", a);
}
b
去了哪里?在任何地方,函数都没有使用它。在#define X(value,a)
中,值和a
是宏参数。如果您传递X(value1,1)
,那么这些将成为这些宏参数的值,就像将参数传递给函数一样
对于#定义X(值,a)字符值[10]
,宏中未使用参数a
,因此将忽略该参数
这在使用X宏时很常见,您可能有几个值,但只有一些值在特定情况下有意义。您仍然需要传递所有参数,但在每个宏中使用它们是可选的
它就像普通的旧函数一样工作。此函数完全有效:
void foo (int a, int b)
{
printf("%d", a);
}
b
去了哪里?在任何地方,函数都没有使用它。请不要用存在的每个C标记进行标记。如果您谈论的是C,请仅使用C
标记。如果你谈论的是一个特定的版本,那么只标记该版本。你根本不清楚你在问什么。你有结果,那你不明白的是什么?谢谢你通知我。我以后会做的。我在帖子里做了一些更新。我不明白文本是如何替换的。请再次查看帖子!我不明白<代码>#定义X(值,a)字符值[10]
和X(value1,1)
-为什么您会期望字符值[10]1代码><代码>为什么宏将值视为文本,然后立即将它放在1位?< /代码>是的。宏仅对文本进行操作。请不要使用存在的每个C标记进行标记。如果您谈论的是C,请仅使用C
标记。如果你谈论的是一个特定的版本,那么只标记该版本。你根本不清楚你在问什么。你有结果,那你不明白的是什么?谢谢你通知我。我以后会做的。我在帖子里做了一些更新。我不明白文本是如何替换的。请再次查看帖子!我不明白<代码>#定义X(值,a)字符值[10]
和X(value1,1)
-为什么您会期望字符值[10]1代码><代码>为什么宏将值视为文本,然后立即将它放在1位?< /代码>是的。宏仅对文本进行操作。感谢@Lundin的解释。我不明白的是,宏忽略了未使用的参数。现在一切都清楚了。@Haider这些X宏通常都是这样结束的,因为您已经强迫它们在列表中始终使用两个参数,如X(value1,1)
。我想您可以选择编写#定义X(value,…)char value[10]代码>,这也可以,但可能会增加更多的混乱。当我们说“宏名称可以协商”时,这是什么意思。根据这个答案@Haider,这仅仅意味着你可以随意命名你的宏…?这很清楚,谢谢。因为英语不是我的第一语言,所以我无法理解“可协商”。谢谢@Lundin的解释。我不明白的是,宏忽略了未使用的参数。现在一切都清楚了。@Haider这些X宏通常都是这样结束的,因为您已经强迫它们在列表中始终使用两个参数,如X(value1,1)
。我想您可以选择编写#定义X(value,…)char value[10]代码>,这也可以,但可能会增加更多的混乱。当我们说“宏名称可以协商”时,这是什么意思。根据这个答案@Haider,这仅仅意味着你可以随意命名你的宏…?这很清楚,谢谢。因为英语不是我的第一语言,所以我不能理解“可协商”。
void foo (int a, int b)
{
printf("%d", a);
}