【问题标题】:printf(" LIST.H ") where LIST.H is a macroprintf(" LIST.H ") 其中 LIST.H 是一个宏
【发布时间】:2011-06-20 16:15:21
【问题描述】:
#include <stdio.h>
#include<stdlib.h>
#define LIST.H onus;

int main ()
{
         char *p,*s;
         printf(" LIST.H ");
}

我希望 LIST.H 打印 onus 作为输出。 但这不会发生。 编译时我收到警告

temp.c:3:13: warning: missing whitespace after the macro name

并且输出是 LIST.H 而不是责任。 上面的宏如何打印出想要的东西?

更新
我想要输出 如onus,字符串前后各有一个空格。

【问题讨论】:

  • 我想知道“onus”是不是委婉语:)
  • 这取决于你的“想要的东西”。现在的代码几乎没有意义,因此无法弄清楚“想要的东西”到底是什么。基本上,您可以完全忘记宏并执行printf("onus")。这将打印你想要的。如果这对您不起作用,您必须更详细地解释您在此处尝试执行的操作。

标签: c macros printf


【解决方案1】:

宏名称中不能包含.。这就是您收到警告的原因: warning: missing whitespace after the macro name,在 LIST 之后它需要一个空格,但它却得到了一个 .

此外,当宏名称在字符串内("string" 之间)时,它不会被宏定义替换。

你可以这样做:

#define LISTH "onus"

// and then
  printf(LISTH);

预处理器将转换为:

  printf("onus");

如果你这样做:

#define LISTH "onus";

预处理器会将其转换为:

 printf("onus";);

不会编译。

【讨论】:

  • 不,预处理器会将其转换为printf("onus";);,甚至无法编译。
  • @pmg 和 AndreyT 感谢您指出这一点,我忘记了 ;
【解决方案2】:

首先,您不能在宏名称中使用.

其次,您应该“期望”它打印ouns;,因为您在宏定义中包含了;

第三,为了实现这一点,您可以使用“字符串化”宏操作符# 和一些辅助宏

#define TO_STRING_(x) #x
#define TO_STRING(x) TO_STRING_(x)


#define LIST_H onus
...
printf(" " TO_STRING(LIST_H) " ");

或者,更好

printf(" %s ", TO_STRING(LIST_H));

【讨论】:

  • 为什么需要第二个宏?
  • @Armen Tsirunyan:我不想在评论中描述整个事情(自己搜索),但是如果你想使用宏作为其他宏的参数,你通常需要定义您的宏以这种二级方式进行,以便参数替换按您的预期工作。
  • 基本上,如果您使用一级宏#define TO_STRING(x) #x,那么TO_STRING(LIST_H) 将扩展为"LIST_H" 而不是"onus"
【解决方案3】:
#include <stdio.h>

#define LIST_H "onus"

int main()
{
    printf(LIST_H);
}

【讨论】:

    【解决方案4】:

    字符串中的宏无法解析,您需要多层宏解析才能做到这一点:

    #define __STR(x) #x
    #define _STR(x) __STR(x)
    
    printf(_STR(LIST));
    

    我上次检查的宏定义中也不能有点,这就是你的错误所在,所以宁愿使用LIST_H...

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2016-10-02
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多