【问题标题】:What is (void*) casting used for?(void*) 铸造用于什么?
【发布时间】:2013-05-27 19:25:06
【问题描述】:

我确实尝试在 StackOverflow 上搜索此内容,但我认为由于语法和不知道要搜索的确切内容,我有点卡住了。

我看到(void*) 被用于强制转换,通常用于函数调用。这是干什么用的?

【问题讨论】:

  • 几乎没有 C 那么多。我们有更好的方法来完成它的大部分用途。
  • @chris 您能否在下面的答案中详细说明,并举例说明它的用途以及为什么我们不再需要在 c++ 中这样做?
  • 我们用它来与C代码交互。
  • 你的意思是(void*)
  • @user997112,老实说,我今天没有很好的被动记忆状态来提出示例列表,但boost::variantboost::any 在各自领域中是不错的选择。

标签: c++ casting void-pointers


【解决方案1】:

void*,通常称为void指针,是一种通用指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎相同,因此您可以使用 void 指针来避免类型检查,这在编写处理多种数据类型的函数时很有用。

Void 指针在 C 中比在 C++ 中更有用。您通常应该避免使用 void 指针,而是使用函数重载或模板。类型检查是个好东西!

【讨论】:

  • 如果我错了,请告诉我; “C 中的 void 指针本质上(在概念上)与 Java 中的 Object 相同”
  • 也许说“C 中的 void 指针本质上(在概念上)与 Java 中的 Object REFERENCE 相同”会更正确
【解决方案2】:

void 指针是指向类型和大小未知的值的指针。我将举例说明如何在 C 中使用它——尽管其他评论者说它大体上不应该在 C++ 中使用(实际上也没有必要)是正确的。

假设您有一个存储键和值的结构。可以这样定义:

typedef struct item_t
{
    char *key;
    int value;
} item_t;

所以你可以使用这个结构来匹配任何字符串键和一个整数值。但是如果你想存储一些任意值怎么办?也许你想要一些键与整数匹配,一些键与双精度匹配?您需要以这样一种方式定义您的结构,它会跟踪(使用指针)任意类型和大小的值。在这种情况下,void * 符合要求:

typedef struct item_t
{
    char *key;
    void *value;
} item_t;

现在,如果您的值是一个 int,您可以使用 (int *) value 获取它的值,或者如果它的值是一个 double,您可以使用 (double *) value 来获取它。当然,这假设使用该结构的代码知道它期望在什么上下文中看到什么类型。

但是,在 C++ 中,通常不是通过使用 void * 来实现相同的功能,而是通过使用模板或所有不同类型都源自的超类(例如 Java 中的 Object - a对象列表可以存储一些字符串、一些整数等)。

【讨论】:

    【解决方案3】:

    这是在 C/C++ 中提供指向对象的指针的最通用方式。就像 C# 或 Java 中的 object

    【讨论】:

      【解决方案4】:

      这主要用于当您要传递可以具有不同状态的参数时。

      例如,在您的通用代码中,您可以将void* 作为参数传递,然后在该代码的“特定”实现中,您可以将void* 转换为您想要的任何内容

      通用代码,abc.h

      void Test(void* pHandle);
      

      Windows 代码,abc.cpp

      void Test(void* phandle)
      {
         WindowsStructure* myStruct = (WindowsStructure*)(pHandle);
          myStruct->getWhatINeed;
      }
      

      Linux 代码,abc.cpp

      void Test(void* phandle)
      {
         LinuxStructure* myStruct = (LinuxStructure*)(pHandle);
          myStruct->getWhatINeed;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多