c - C stdlib 函数中的抽象格式说明符(例如 printf、scanf)

标签 c string-formatting c-preprocessor

可能的情况是,我们从 I/O 调用中大量使用的初始类型开始,并希望稍后更改该类型。例如,假设我们有:

typedef unsigned short int board_idx;
//...
board_idx k_in;
scanf("%10hu", &k_in);

如果我们稍后更改 board_idx 的类型,则稍后将很难返回并更改所有此类格式说明符以匹配此类型。

我首先猜测一个好的方法是为格式说明符定义一个关联的字符串文字(最好紧邻 board_idx 的类型定义),然后将其插入到格式说明符。然而,这似乎也有点困难(使用例如 strcat),所以我想知道其他人在这种情况下会做什么?

How to replace a piece of const char* with another string in C? 的方法为基础表明如果我们将字符串替换代码封装在一个函数中,该函数可以应用于具有与相应类型相对应的唯一标识符的格式说明符,我们也许能够做到这一点。在上面的 scanf 示例中,这可能是:

"%10hu" // should be initially "%board_idx", which can then be replaced

此方法的缺点是运行时成本,因此我现在认为只要在编译时已知嵌入格式说明符的所有字符串,预处理器解决方案可能是最好的,例如:

// Untested and probably won't work ... I'll call it pseudocode:
#define STR(x) #x
#define STRINGIFY(x) STR(x) 
//
#define BOARD_IDX_FMT = %10hu
// "my input is %10hu" becomes:
#define FMTSPEC STRINGIFY(my input is ) #BOARD_IDX_FMT 
printf(FMTSPEC);

但是对于具有许多格式说明符的字符串来说,这也将非常复杂。

最佳答案

However, this also seems somewhat arduous (using e.g. strcat)

在 C 中,相邻的字符串文字会在编译时自动连接

"asd" "qwe"  --> "asdqwe"

所以按照这些思路应该可以工作

#define FMT "%d"
printf("Hello " FMT "!\n", 17);

关于c - C stdlib 函数中的抽象格式说明符(例如 printf、scanf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557042/

相关文章:

字符串中带有大括号的 C# String.Format

c# - 获取此格式的日期时间 : 2018-10-26T16:44:38+01:00

objective-c - Xcode 4 : define a preprocessor macro in a dependent target

c - 当a=1时a,a++,++a的输出是多少;

c - 如何在 C 中用零填充空白(整数)位置?

c - 使 C 程序更小

c - 使用##运算符

c - 调用对象 ‘x2’ 的宏错误不是函数

c - 如何在函数中传递和返回整数数组

c - SPI_I2S_ReceiveData 始终返回 0xff 或 0x00