为什么将fread()的第一个参数强制转换为其他类型

时间:2014-05-02 06:43:35

标签: c fwrite fread

以下是该计划:

FILE *fp;
struct record rec;
while (fread((char *)&rec, sizeof(rec), 1, fp) == 1) // Here
{
    /* do something to rec */
    if (/*rec must be rewritten*/) 
    {
        fseek(fp, -(long)sizeof(rec), 1);
        fwrite((char*)&rec, sizeof(rec), 1, fp);  // And here
    }
}

看看笔记,作者说:

  

初看起来看起来很合理:&rec会谨慎转为char *传递给freadfwrite ......

我无法理解其含义。

1 个答案:

答案 0 :(得分:4)

首先,不要尝试在代码块中使用SO **标记。它没有按预期工作,只会造成混乱。

其次,这本书显然已经过时了。回到C语言的旧版本,没有void *类型,而char *类型通常用作" generic"指针类型。 fread的第一个参数是使用char *类型声明的。出于这个原因,习惯上将实际参数类型的显式强制转换为char *以避免编译器警告。如果使用旧版本的标准库(声明freadchar *参数的标准库),今天甚至可能是必要的。

Modern C标准库使用类型fread的第一个参数声明void *。在这种情况下,不需要强制转换,并且转换为char *毫无意义。