我有2个数组,其中一个是注释,我想制作通用printf来绘制值:
int values [] = { 88, 56, 100, 2, 25 };
//float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f};
if (value[0] is int) {
for(i; i < 5; ++i)
printf("%d ", *(values + i));
} else {
for(i; i < 5; ++i)
printf("%f ", *(values + i));
}
有什么方法可以检查吗?例如,当我想查看元素是char还是int时,我使用了sizeof
答案 0 :(得分:3)
需要注意的是,在调试程序时,您只能使用“功能”,这是很复杂的,您可以使用C11的_Generic
构造:
_Generic(values[0], int: 0, float:1, default:2)
你可能应该做的事情更符合你的意图是条件编译:
#define FLOAT_CASE
#ifdef FLOAT_CASE
float values[] = {88.5f, 56.5f, 100.0f, 2.234f, 88.12f};
#else
int values [] = { 88, 56, 100, 2, 25 };
#endif
... // all the code that is independent of the type of values here
for(i; i < 5; ++i)
#ifdef FLOAT_CASE
printf("%f ", *(values + i));
#else
printf("%d ", *(values + i));
#endif
答案 1 :(得分:2)
一个丑陋的解决方案:如果您只需要在int和float之间进行区分,则可以为变量分配一个非整数值,例如0.1,然后测试实际值。这给出了类似的东西:
#define IS_INT_TYPE(x) (x=0.1, x==0)
但是,这会破坏宏参数的原始值。如果使用gcc,则可以使用typeof()扩展来强制转换值:
#define IS_INT_TYPE(x) (((typeof(x)) 0.1) == 0)
Pascal的笔记给了我解决方案的想法:
#define IS_INT_TYPE(x) (((x*0+1)/2) == 0)