sig*_*ice 8 c gcc integer c-preprocessor
作为练习,我想写一个宏,它告诉我是否签署了整数变量.这就是我到目前为止所得到的结果,如果我在使用gcc -fsigned-char或-funsigned-char的char变量上尝试这个结果,我会得到结果.
#define ISVARSIGNED(V) (V = -1, (V < 0) ? 1 : 0) 
这是便携式吗?有没有办法在不破坏变量值的情况下执行此操作?
#define ISVARSIGNED(V)  ((V)<0 || (-V)<0 || (V-1)<0)
不改变V的值.第三个测试处理V == 0的情况.
在我的编译器(gcc/Cygwin的),这适用于int和long,但不适合char或short.
#define ISVARSIGNED(V) ((V)-1<0 || -(V)-1<0)
在两次测试中也做了这项工作.
#define ISVARSIGNED(V) ((-(V) < 0) != ((V) < 0))
不破坏变量的值.但不适用于0值.
关于什么:
#define ISVARSIGNED(V) (((V)-(V)-1) < 0)
如果您正在使用GCC,则可以使用typeof关键字来覆盖该值:
#define ISVARSIGNED(V) ({ typeof (V) _V = -1; _V < 0 ? 1 : 0 })
这将创建一个临时变量,_V其类型与V.
至于便携性,我不知道.它可以在两个赞美机器上运行(也就是你的代码将在任何可能的情况下运行的所有东西),我相信它也适用于一个人的赞美和符号级别的机器.作为旁注,如果您使用typeof,您可能希望-1转换typeof (V)为使其更安全(即不太可能触发警告).
| 归档时间: | 
 | 
| 查看次数: | 1661 次 | 
| 最近记录: |