printf(“LIST.H”)其中LIST.H是一个宏

时间:2011-06-20 16:15:22

标签: c macros printf

#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,在字符串之前和之后有一个空格。

4 个答案:

答案 0 :(得分:5)

宏名称中不能包含.。这就是你得到警告的原因: warning: missing whitespace after the macro nameLIST后需要空格,但会获得.

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

你可以这样做:

#define LISTH "onus"

// and then
  printf(LISTH);

预处理器将转换为:

  printf("onus");

如果你这样做:

#define LISTH "onus";

预处理器会将其转换为:

 printf("onus";);

将无法编译。

答案 1 :(得分:2)

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

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

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

#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));

答案 2 :(得分:1)

#include <stdio.h>

#define LIST_H "onus"

int main()
{
    printf(LIST_H);
}

答案 3 :(得分:1)

字符串中的宏未解析,您需要使用宏分辨率层来执行此操作:

#define __STR(x) #x
#define _STR(x) __STR(x)

printf(_STR(LIST));

你最后检查的宏定义中也没有点,这就是你的错误所在,所以请使用LIST_H ......