Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不后跟宏参数_C_Macros_C Preprocessor - Fatal编程技术网

C 不后跟宏参数

C 不后跟宏参数,c,macros,c-preprocessor,C,Macros,C Preprocessor,我有以下代码: 定义最大名称长度15 定义打印单元\ 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\u NAME\u LEN不

我有以下代码:

定义最大名称长度15 定义打印单元\ 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\u NAME\u LEN不好,因为MAX\u NAME\u LEN不是宏参数

您可以使用额外的辅助宏修复此问题:

#define MAX_NAME_LEN 15

#define STRINGIFY(s) \
    #s

#define PRINT_CELL(x) \
    printf("|%" STRINGIFY(MAX_NAME_LEN) "s|", #x);
这解决了来自cpp的投诉,但结果编译时出错,因为输出生成了关于printf格式字符串的投诉:

要解决此问题,请将:%s更改为%%:

使用%s的*修饰符可以更好地完成我怀疑您正在尝试的操作:

x很好,因为x是一个宏参数

但是,MAX\u NAME\u LEN不好,因为MAX\u NAME\u LEN不是宏参数

您可以使用额外的辅助宏修复此问题:

#define MAX_NAME_LEN 15

#define STRINGIFY(s) \
    #s

#define PRINT_CELL(x) \
    printf("|%" STRINGIFY(MAX_NAME_LEN) "s|", #x);
这解决了来自cpp的投诉,但结果编译时出错,因为输出生成了关于printf格式字符串的投诉:

要解决此问题,请将:%s更改为%%:

使用%s的*修饰符可以更好地完成我怀疑您正在尝试的操作:

MAX_NAME_LEN是非法的,因为MAX_NAME_LEN不是PRINT CELLx替换列表中的标识符。请改用以下方法:

#define PRINT_CELL(x) printf("|%*s|", MAX_NAME_LEN, #x);
MAX_NAME_LEN是非法的,因为MAX_NAME_LEN不是PRINT CELLx替换列表中的标识符。请改用以下方法:

#define PRINT_CELL(x) printf("|%*s|", MAX_NAME_LEN, #x);

§6.10.3.2 p1:类似于宏的函数的替换列表中的每个预处理标记后面都应跟随一个参数,作为替换列表中的下一个预处理标记。换句话说,您只能将其与该宏的参数一起使用,不适用于其他任意名称。§6.10.3.2 p1:类似于宏的函数的替换列表中的每个预处理标记后面应跟随一个参数,作为替换列表中的下一个预处理标记。换句话说,您只能将其与该宏的参数一起使用,而不能与其他任意名称一起使用。不要使用;或者你大部分时间都会犯错误。@LuisColorado这是一个很好的观点,例如下面讨论了许多替代方案。也就是说,在这种情况下;在OP的代码中,我把它放在那里,因为它与问题的要点无关。一般来说,去掉它更像是C风格,所以如果你需要它,你可以说PRINT_;但是如果你有一个印刷品怎么办;否则b;将生成语法错误,因为if语句将以第二个结尾;代币这与习惯用法define PRINT_cillag do{printfbla;}的问题相同,而不带最后分号的0不使用;或者你大部分时间都会犯错误。@LuisColorado这是一个很好的观点,例如下面讨论了许多替代方案。也就是说,在这种情况下;在OP的代码中,我把它放在那里,因为它与问题的要点无关。一般来说,去掉它更像是C风格,所以如果你需要它,你可以说PRINT_;但是如果你有一个印刷品怎么办;否则b;将生成语法错误,因为if语句将以第二个结尾;代币这与习惯用法define PRINT_cillag do{printfbla;}的问题相同,而0没有最后一个分号
#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
#define PRINT_CELL(x) printf("|%*s|", MAX_NAME_LEN, #x);