【问题标题】:Understanding the text replacement in x macro了解 x 宏中的文本替换
【发布时间】:2020-04-22 10:15:10
【问题描述】:

下面的代码以简单的方式解释了 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    

【问题讨论】:

  • DON'T 标记存在的每一个 C 标签。如果您在谈论 C,请仅使用 c 标记。如果您在谈论特定版本,则标记该版本 only.
  • 完全不清楚你在问什么。你有结果,那有什么不明白的呢?
  • 感谢您通知我。我以后会做的。
  • 我在帖子中做了一些更新。我不明白文本是如何替换的。请再次检查帖子!
  • 我不明白。 #define X(value, a) char value[10];X(value1, 1) - 你为什么会期待 char value[10]1;why the macro consider value as the text and place 1 immediately after it? 是的。宏只作用于文本。

标签: c c-preprocessor x-macros


【解决方案1】:

#define X(value, a) 中,valuea 是宏参数。如果您传递X(value1, 1),那么这些将成为这些宏参数的值,就像您将参数传递给函数时一样。

#define X(value, a) char value[10]; 的情况下,参数a 未在宏中使用,因此被忽略。

这在使用 X 宏时很常见,您可能有多个值,但只有一些在特定情况下有意义。您仍然需要传递所有参数,但在每个宏中使用它们是可选的。

它就像普通的旧函数一样工作。这个函数完全有效:

void foo (int a, int b)
{
  printf("%d", a);
}

b 去哪儿了?没地方,函数根本没用。

【讨论】:

  • 感谢@Lundin 的解释。我不明白的是宏忽略了未使用的参数。现在一切都清楚了。
  • @Haider 这些 X 宏通常以这样的方式结束,因为您已经强制它们始终使用列表中的 2 个参数,例如 X(value1, 1)。我想你可以选择写#define X(value, ...) char value[10];,这样也可以正常工作,但它可能只会增加更多的混乱。
  • 当我们说“宏名称是可以协商的”时,这是什么意思。根据这个答案link
  • @Haider 这只是意味着您可以随意命名宏...?
  • 这很清楚,谢谢。因为英语不是我的第一语言,我听不懂“negotiable”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多