Re: [问题] printf type of value

楼主: LPH66 (-6.2598534e+18f)   2014-07-29 02:07:19
: → qas612820704:其实是因为我用#define DATATYPE XXXX 07/29 01:28
: → qas612820704:然而要printf时要给format 可是我之后在用这个档案时 07/29 01:29
: → qas612820704:可能会把 XXXX 改成 int 或是 char之类的 07/29 01:30
: → qas612820704:所以我不确定我写一些变量他的type是什么 07/29 01:31
: → qas612820704:只确定他的type示我define的那个DATATYPE 07/29 01:31
: → qas612820704:所以我想反向知道我的DATATYPE a是什么 07/29 01:33
: → qas612820704:然后再给一些关于那个type的操作例如printf 07/29 01:34
: → qas612820704:就我这样讲好像就是给他一些适度的附载平衡就解掉了 07/29 01:35
: → qas612820704:那如果是这样的话 要怎么 overflow <(_ _)> 07/29 01:37
C 语言的话应该只能暴力解了...
还好你的情境应该只会用在 primitive type 上
如果没有用到两个 keyword 以上的型态 (例如 long long)
那应该可以这么做:
#define DATATYPE XXX
/* 更多就再加 */
#define FORMAT_int "%d"
#define FORMAT_char "%c"
#define FORMAT_long "%ld"
#define FORMAT_float "%f"
/* 要多一层的原因是因为在下面使用中 DATATYPE 得让它先展开的关系
如果直接 ## 就不会展开, 只会得到 FORMAT_DATATYPE */
#define FORMAT1(type) FORMAT_ ## type
#define FORMAT(type) FORMAT1(type)
void output(DATATYPE data)
{
/* 下面这么写 OK 的原因是因为
C/C++ 里两个或以上的常数字串并排时 (例如 "foo" "bar" 这样)
编译器会帮你接在一起 (上例就是等同于 "foobar") */
printf("data = " FORMAT(DATATYPE), data);
}
作者: IhateOGC (我讨厌)   2014-07-29 02:24:00
Macro 神人\(^▽^)/
作者: loveme00835 (发箍)   2014-07-29 03:16:00
<inttypes.h>
作者: qas612820704 (Lego)   2014-07-29 09:53:00
不好意思可以解释一下这两行吗#define FORMAT1(type) FORMAT_ ## type#define FORMAT(type) FORMAT1(type)第1行这什么鬼=_=...
作者: Killercat (杀人猫™)   2014-07-29 09:56:00
http://tinyurl.com/m7p2vns 找 宏的单行定义
作者: suhorng ( )   2014-07-29 13:44:00
## 就是接起来阿

Links booklink

Contact Us: admin [ a t ] ucptt.com