#后面没有宏参数

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