可能是这样的情况,我们从在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);


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

最佳答案

但是,这似乎也有些艰巨(例如使用strcat)


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

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


所以遵循这些思路的东西应该起作用

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

07-25 21:53