我想知道是否可以使用C预处理定义来更改字符串格式说明符。我尝试过编写以下内容,但似乎得到了一个编译器错误。它只是试图用正确的格式说明符替换现有的格式说明符。
#include <stdio.h>
//This is the problem line....
#define %d %llu
int main(int argc, char** argv){
unsigned long long int myInt = 0;
printf("myInt start value: %d", myInt++);
printf("myInt value=%d (that got incremented)", myInt++);
printf("myInt value: %d; wow, another post-increment", myInt++);
printf("myInt final value %d", myInt);
return 0;
}我得到以下编译器错误:
error: expected an identifier
#define %d %llu
^为什么这个语法是不可接受的?有可能做到吗?
发布于 2018-05-29 14:35:29
你想做什么是不可能的。
宏在字符串文本中不被替换,有效标识符名称的规则也适用于宏名称。
你能做的就是这样:
#if xyz
#define FMT "%d"
#else
#define FMT "%lli"
#endif
....
printf("myInt start value: " FMT "\n", myInt++);顺便说一句:通常你不应该需要这个。对于本机类型int、long等,格式说明符应该可以正常使用。
用于固定大小的类型(如int64_t等)在inttypes.h中已经定义了宏
发布于 2018-05-29 14:42:44
有可能做到吗?不,你这样做是不可能的。在陈述中
#define %d %lli 宏名称必须是有效的标识符。
来自C99标准
第6.10.1节定义标识符替换-列表新行并从7.1.13开始
将宏名作为有效标识符.例如,将宏定义为
#define INT_FMT "%d"然后
int myInt = 10;
printf("myInt start value is : " INT_FMT "\n", myInt);https://stackoverflow.com/questions/50586997
复制相似问题