C 理解x宏中的文本替换

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

下面的代码解释了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; 
} 
它将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);
}