gpt4 book ai didi

C宏生成printf格式字符串

转载 作者:太空狗 更新时间:2023-10-29 15:11:07 25 4
gpt4 key购买 nike

是否可以编写一个返回 printf 格式的宏(使用标记连接)?例如

#define STR_FMT(x) ...code-here...

STR_FMT(10) 扩展为 "%10s"

STR_FMT(15) 扩展为 "%15s"

...等等

这样我就可以在 printf 中使用这个宏了:

printf(STR_FMT(10), "*");

最佳答案

可以,但我认为使用 printf() 必须动态指定字段大小和/或精度的功能可能更好:

#include <stdio.h>

int main(int argc, char* argv[])
{
// specify the field size dynamically
printf( ":%*s:\n", 10, "*");
printf( ":%*s:\n", 15, "*");

// specify the precision dynamically
printf( "%.*s\n", 10, "******************************************");
printf( "%.*s\n", 15, "******************************************");

return 0;
}

这具有不使用预处理器的优点,还允许您使用变量或函数来指定字段宽度而不是文字。


如果您确实决定改用宏,请间接使用 # 运算符(如果您在别处使用它,则使用 ## 运算符),如下所示:

// macros to allow safer use of the # and ## operators
#ifndef STRINGIFY
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#endif

#define STR_FMTB(x) "%" STRINGIFY(x) "s"

否则,如果您决定使用宏来指定字段宽度,则会出现意外行为(如 What are the applications of the ## preprocessor operator and gotchas to consider? 中所述)。

关于C宏生成printf格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4010221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com