c - C 预处理器定义替换字符串格式说明符
问题描述
我想知道是否可以使用 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
^
为什么这种语法不可接受?甚至有可能实现吗?
解决方案
你想做的事情是不可能的。
宏不会在字符串文字中替换,有效标识符名称的规则也适用于宏名称。
你可以做的是这样的:
#if xyz
#define FMT "%d"
#else
#define FMT "%lli"
#endif
....
printf("myInt start value: " FMT "\n", myInt++);
顺便说一句:通常你不应该需要这个。对于原生类型int
等long
,格式说明符应该可以正常使用。
对于具有固定大小的类型(例如int64_t
等),已经在inttypes.h中定义了宏
推荐阅读
- python - Python单元测试expectedFailureIf
- android - 如何删除 Android Oreo 中固定的快捷方式徽章?
- javascript - 如果属性值匹配,则从数组中删除对象
- utf-8 - 我正在寻求将 Paypal IPN 与 Marklogic 集成的帮助
- c# - 如果我传递一个没有所需属性值的对象,为什么我的 ModelState 有效?
- javascript - 在 vis.js 中以最少的物理特性避免重叠边缘
- java - 创建一个以 hh:mm:ss 格式显示时间的计时器 JavaFX
- c# - 获取列表
来自数据表 - asp.net - Request.Form[cboCustomer.UniqueID] 给出空值
- r - 如何在保持每个样品的丰度的同时将丰度矩阵转换为存在-不存在矩阵