`printf()` 可以有宏参数吗?

Can `printf()` have a macro parameter?

我正在使用以下 printf 函数:

    printf("%-8s%-21s%-17s%-6s\n", "index", "Name", "Effect", "Type");

但是,我想使用预定义的宏而不是“8”:

#define NAME_SIZE 8

当我尝试替换它时,IDE 无法识别它并给出错误:Invalid conversion specifier N(宏的第一个字母)。我尝试将宏名称放在 () 括号中或在这些括号中放置一个间隔,但都没有用。所以我想知道:是否有可能将宏作为参数放入 printf 函数中,如果可以,怎么做?很抱歉提出这样一个奇怪的问题,但我找不到任何信息。

假设您可以稍微不同地定义宏:

如果您可以定义为 #define NAME_SIZE "8",那么 printf("%-"NAME_SIZE"s%-21s%-17s%-6s\n", "index", "Name", "Effect", "Type"); 将按照我的理解作为您的目标。

这是因为编译器将直接连接相邻的字符串文字,例如 "a""b""ab"

如果宏必须完全如图所示,则必须在另一层宏中使用 # 运算符来绕道。

是的,您确实可以这样做(尽管在您的特定情况下,您可以传递参数宽度,这是一种更好的方法)。事实上,C 和 C++ 的一些标准库利用了这一点(或者换句话说,将其批准为合法技术),例如使用 PRId64 来正确格式化 int64_t:

#include <inttypes.h>
int64_t t = 0;
printf("%" PRId64 "\n", t);

对于你的情况,你需要

#define NAME_SIZE "8"

连同

printf("%-"NAME_SIZE"s%-21s%-17s%-6s\n", "index", "Name", "Effect", "Type");

您可以通过以下方式进行操作

#include <stdio.h>

#define SIZE( X )   #X

int main(void) 
{
    printf("%-" SIZE( 8 ) "s%-21s%-17s%-6s\n", "index", "Name", "Effect", "Type");
    printf("%-8s%-21s%-17s%-6s\n", "index", "Name", "Effect", "Type");
    
    return 0;
}

程序输出为

index   Name                 Effect           Type  
index   Name                 Effect           Type