`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
我正在使用以下 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