可能的情况是,我们从 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/