【问题标题】:(char*)&obj alternatives(char*)&obj 替代品
【发布时间】:2019-09-04 20:08:31
【问题描述】:

我看到这通常用于文件处理,(char*)&obj。 自 C++11 以来有很多可用的转换方法,比如静态转换,我们不能在这些方法上使用一种吗?

【问题讨论】:

  • 它基本上用于一次只传输一个字节的数据,它的行为本质上类似于reinterpret_cast
  • 有些人认为应该在这种情况下使用reinterpret_cast,其他人则使用C风格的演员表。 (我在reinterpret_cast 阵营。)这归结为风格问题和您团队的惯例。使用最适合您的团队的方法。我更喜欢更详细的风格,因为这样我可以更轻松地grep
  • "常用于文件处理,(char*)&obj"。你能在这里举个例子吗?在很多情况下可以省略对(char*) 的强制转换。如果二进制写入需要char*,我认为这是一个设计错误。这些函数应该取void *
  • @geza FWIW,std::basic_ifstream::read 使用 char *
  • 另请阅读 this,了解 ()(也称为 C 风格的演员表)如何在 C++ 中工作。

标签: c++ c++11 file-handling


【解决方案1】:

& 符号是用来获取 obj 的地址的。

例子:

#include <cstdio>

void printData(const char* p, int n) {
  for(int i = 0; i < n; i++)
    printf("byte %2d : %d\n", i, (int)p[i]);
}

struct DataStruct {
  int x;
  int y;
};

int main() {
  DataStruct obj;
  obj.x = 5;
  obj.y = 257;
  char* dataPtr = (char*)&obj;
  printData(dataPtr, sizeof(DataStruct));
  return 0;
}

(char*)&obj 操作用于获取一个 char*,该 char* 可以传递给 printData 函数,该函数只需要打印一个字符数组。

在那个例子中,行

char* dataPtr = (char*)&obj;

可以改为使用 reinterpret_cast 编写,如下所示:

char* dataPtr = reinterpret_cast<char*>(&obj);

它会做同样的事情。使用 reinterpret_cast 而不是晦涩难懂的 (char*)&obj 的一个优点是,当您编写 reinterpret_cast 时,可以更清楚地看到您在代码中的那个时候正在做一些奇怪且可能很危险的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2011-06-10
    • 2014-04-18
    • 2012-04-08
    • 2012-07-09
    • 2011-03-31
    • 2023-03-12
    相关资源
    最近更新 更多