#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
,在字符串之前和之后有一个空格。
答案 0 :(得分:5)
宏名称中不能包含.
。这就是你得到警告的原因:
warning: missing whitespace after the macro name
,LIST
后需要空格,但会获得.
。
此外,当宏名称在字符串内时("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
......