类型强制转换出错,恳请帮忙

ycbcc 2011-02-24 04:40:49
下面的代码只是从实际代码中简化出来,所以请不要考虑其合理性,只管编译通过即可。

#include <stdio.h>
#include <stdlib.h>

#define TEST(T) \
void freeMem(T t) { free((void *)(int)t); }

TEST(float); // 这里如果改成TEST(int)或者TEST(void *)都可以编译通过

int main()
{
float i = 0.1;
free(&i); // 这一行是可以的!为什么放到宏里就不行了呢?
freeMem(&i);
return 0;
}
...全文
115 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ycbcc 的回复:]
引用 9 楼 mstlq 的回复:

也可以
C/C++ code
#define TEST(T) \
void freeMem(T t) { free((void *)(int)t); }

TEST(float*); //注意这个*

不可以,我的参数不可以改变,因为这个参数还有其他作用。
TEST(float)中的float,会根据实际用户生成:
TEST(int)
……
[/Quote]
跟宏什么的没关系……
问题关键是地址值无法转换成float,而不是float不能转化成指针
好好看清楚……

为什么不能改呢?
又没有改你的宏,大不了就


#define TEST(T) \
void freeMem(T t) { free((void *)(int)t); }
/*上面的宏我一点都没改*/
TEST(float); //楼主你爱留着就留着
TEST(float*); //我在这里加一个
ycbcc 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mstlq 的回复:]

也可以
C/C++ code
#define TEST(T) \
void freeMem(T t) { free((void *)(int)t); }

TEST(float*); //注意这个*
[/Quote]
不可以,我的参数不可以改变,因为这个参数还有其他作用。
TEST(float)中的float,会根据实际用户生成:
TEST(int)
TEST(void *)
TEST(...

现在的问题就是不知道为什么,float在宏里,编译器无法强制转换成指针。
但不在宏里是可以的。
mstlq 2011-02-24
  • 打赏
  • 举报
回复
也可以
#define TEST(T) \
void freeMem(T t) { free((void *)(int)t); }

TEST(float*); //注意这个*
mstlq 2011-02-24
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

#define TEST(T) \
void freeMem(T* t) { free((void *)(int)t); }
/*看void freeMem(T* t)*/
TEST(float); // 这里如果改成TEST(int)或者TEST(void *)都可以编译通过

int main()
{
float i = 0.1;
float *pi= malloc(sizeof(float));
/*free(&i); 这一行可以通过编译,但执行可能会挂*/
freeMem(pi);
/*注意虽然freeMem(&i)也能通过编译,但是运行会挂的,
free需要和malloc对应,随便free一个地址是会引起未知错误的*/
return 0;
}


justkk 2011-02-24
  • 打赏
  • 举报
回复
freeMem(&i);

前面的定义是float参数,你这儿为什么传一个float *指针呢?
icy_tear 2011-02-24
  • 打赏
  • 举报
回复
freeMem()函数形参类型为float 类型,但是你却将&i即指针(或地址)作为实参传给了freeMem,显然类型不匹配

改为freeMem(i);即可
  • 打赏
  • 举报
回复
宏展开之后的代码如下。
错误就很明显了吧

void freeMem(float t) { free((void *)(int)t); };

int main()
{
float i = 0.1;
free( &i );
freeMem( &i );
return 0;
}

  • 打赏
  • 举报
回复
没明白,你不会是想TEST(&i)吧
bdmh 2011-02-24
  • 打赏
  • 举报
回复
T是啥,无法编译
pengzhixi 2011-02-24
  • 打赏
  • 举报
回复
#define TEST(T)//额,你这里怎么传参?

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧