#后面没有宏参数
# not followed by macro parameter
我有以下代码:
#define MAX_NAME_LEN 15
#define PRINT_CELL(x) \
printf("|%" #MAX_NAME_LEN "s|", #x);
当我尝试编译时,出现以下错误:
main.c:9:21: error: '#' is not followed by a macro parameter
9 | #define PRINT_CELL(x) \
| ^
我不太确定我做错了什么。我该如何解决这个问题?
#x
没问题,因为 x
是一个宏 参数 。
但是,#MAX_NAME_LEN
不是 因为 MAX_NAME_LEN
不是 宏 参数
您可以使用额外的“辅助”宏来解决此问题:
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%" STRINGIFY(MAX_NAME_LEN) "s|", #x);
这解决了 cpp
的投诉,但结果编译时出现错误,因为输出产生了关于 printf
:
的格式字符串的投诉
int
main(void)
{
printf("|%" "MAX_NAME_LEN" "s|" "hello");
return 0;
}
要解决这个问题,请将:%
更改为 %%
:
#include <stdio.h>
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%%" STRINGIFY(MAX_NAME_LEN) "s|" #x "\n");
int
main(void)
{
PRINT_CELL(hello)
return 0;
}
但是,当我们运行那个版本时,程序的输出是:
|%MAX_NAME_LENs|hello
我怀疑您正在尝试做的事情可以使用 %s
的 *
修饰符更好地完成:
#include <stdio.h>
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%*s\n",MAX_NAME_LEN,#x);
int
main(void)
{
PRINT_CELL(hello)
return 0;
}
这个输出是:
| hello
#MAX_NAME_LEN
是非法的,因为 MAX_NAME_LEN
不是 PRINT_CELL(x)
macro 的替换列表中的标识符。请改用以下内容:
#define PRINT_CELL(x) printf("|%*s|", MAX_NAME_LEN, #x);
我有以下代码:
#define MAX_NAME_LEN 15
#define PRINT_CELL(x) \
printf("|%" #MAX_NAME_LEN "s|", #x);
当我尝试编译时,出现以下错误:
main.c:9:21: error: '#' is not followed by a macro parameter
9 | #define PRINT_CELL(x) \
| ^
我不太确定我做错了什么。我该如何解决这个问题?
#x
没问题,因为 x
是一个宏 参数 。
但是,#MAX_NAME_LEN
不是 因为 MAX_NAME_LEN
不是 宏 参数
您可以使用额外的“辅助”宏来解决此问题:
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%" STRINGIFY(MAX_NAME_LEN) "s|", #x);
这解决了 cpp
的投诉,但结果编译时出现错误,因为输出产生了关于 printf
:
int
main(void)
{
printf("|%" "MAX_NAME_LEN" "s|" "hello");
return 0;
}
要解决这个问题,请将:%
更改为 %%
:
#include <stdio.h>
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%%" STRINGIFY(MAX_NAME_LEN) "s|" #x "\n");
int
main(void)
{
PRINT_CELL(hello)
return 0;
}
但是,当我们运行那个版本时,程序的输出是:
|%MAX_NAME_LENs|hello
我怀疑您正在尝试做的事情可以使用 %s
的 *
修饰符更好地完成:
#include <stdio.h>
#define MAX_NAME_LEN 15
#define STRINGIFY(s) \
#s
#define PRINT_CELL(x) \
printf("|%*s\n",MAX_NAME_LEN,#x);
int
main(void)
{
PRINT_CELL(hello)
return 0;
}
这个输出是:
| hello
#MAX_NAME_LEN
是非法的,因为 MAX_NAME_LEN
不是 PRINT_CELL(x)
macro 的替换列表中的标识符。请改用以下内容:
#define PRINT_CELL(x) printf("|%*s|", MAX_NAME_LEN, #x);