【问题标题】:C++ : Using void to create variablesC++:使用 void 创建变量
【发布时间】:2015-03-28 16:52:25
【问题描述】:

我正在网上自学 C++。我想知道您是否可以创建void 类型的变量。如果是这样,你怎么能?还有这些变量将用于什么?

这不起作用:

void b;
cout<<b;

错误:

b 的大小未知或为零

谢谢:)

【问题讨论】:

  • void 变量实际上应该是什么?
  • 不,你不能。您可以创建一个 void 指针,但在现代 C++ 中应该避免这样做。
  • @πάνταῥεῖ 准确地说。即使我想知道它
  • ...星际迷航的一集!?
  • “我在网上自学 C++。” - 善待自己,买一本推荐的书:stackoverflow.com/questions/388242/…

标签: c++


【解决方案1】:

“我想知道你是否可以创建一个 void 类型的变量。”

不,编译器已经告诉过你了。

如果是这样,你怎么能?”

见上文。

“这些变量还有什么用途?”

这不会有用,因为void 明确指定无类型


“那么空指针是用来做什么的?”

至于你的评论:

它用于存储任何类型的对象的地址。除非您不知道确切的原始类型,否则它也毫无用处。

【讨论】:

    【解决方案2】:

    这是交易(伙计们,这是一个合法的初学者问题,jaysus,解雇这家伙。)

    C 和 C++ 中的 void 类型是“完全没有类型的事物”的标记或标签。现在,当我们谈论某事物的“类型”时,我们实际上是在说两件事:

    • 它占用多少内存?
    • 我们可以对那个东西执行什么操作?

    因此,例如,当我们声明 int x; 之类的内容时,我们是在说 x

    • sizeof(int) × 8 位内存
    • 具有*+ 等算术运算。

    现在,no 类型的对象两者都没有,因此编译器会告诉您大小未知或为 0。

    有用的是拥有一个没有与之关联的类型的地址。当您将某事声明为int * xp; 时,您是在说xp 是我们同意将其视为int 的某事的地址——但这只是一个协议,因为我们可以,例如通过类型转换、更改或想法稍后。

    当我们声明某事物void * vp; 时,我们是在说“这是某事物的地址,该事物的类型稍后确定。”

    【讨论】:

      【解决方案3】:

      我想我的老师告诉我可以创建一个 void 类型的变量。他说他以后会教我们的

      我们不能有 void 对象,很可能你老师的意思是你可以有一个 void 表达式或一个 void 指针。当函数返回不同类型时,void 表达式对于模板非常有用,例如,请参阅问题:Returning a void?,它提供了以下代码:

      template <class T>
      struct Test
      {
          static constexpr T f() {return T();} 
      };
      
      int main()
      {
          Test<void> test;
          test.f(); // Why not an error?
          return 0;
      }
      

      作为参考,C++ 标准草案如下(强调我的):

      对象类型是(可能是 cv 限定的)类型,它不是函数类型,不是引用类型,并且 不是 空类型。

      和:

      void 类型有一组空值。 void 类型是无法完成的不完整类型。它 用作不返回值的函数的返回类型。任何表达式都可以显式转换 键入 cv void (5.4)。 void 类型的表达式只能使用作为表达式语句 (6.2),作为 逗号表达式 (5.18) 的操作数,作为 ?: (5.16) 的第二个或第三个操作数,作为 typeid 的操作数 或 decltype,作为返回类型为 void 的函数的返回语句 (6.6.3) 中的表达式,或作为 显式转换为 cv void 类型的操作数

      另一种可能性是你的老师指的是 void 指针,当你需要一个可以指向任何类型的指针时使用它。最有可能使用 C API,请参阅when to use void* in c++

      复合类型可以通过以下方式构造:

      和:

      指向给定类型的 void 或对象或函数(包括类的静态成员)的指针

      【讨论】:

        【解决方案4】:

        您可以使用 void 指针来实现这一点。 看这里:

        http://www.learncpp.com/cpp-tutorial/613-void-pointers/

        int nValue;
        float fValue;
        
        struct Something
        {
            int nValue;
            float fValue;
        };
        
        Something sValue;
        
        void *pVoid;
        pVoid = &nValue; // valid
        pVoid = &fValue; // valid
        pVoid = &sValue; // valid
        

        使用 void 指针通常是一种不好的做法。它仅适用于函数指针(在 C++11 之前的标准中)是一种有效的做法。 坚持使用硬类型指针,因为编译器可以对它们进行优化。

        【讨论】:

        • 请在 C++ 领域不要使用 void 指针。给编译器一个战斗的机会
        • @EdHeal 我知道这是一种不好的做法。这只是问题的答案,我只是在证明这是可能的。
        【解决方案5】:

        void 对 C++ 中的 void*s 以​​外的变量类型无效,对实际值类型无效。

        http://www.cplusplus.comvoid*s 上有一个很好的部分:http://www.cplusplus.com/doc/tutorial/pointers/#void

        注意以下几行:

        它们指向的数据不能被直接解引用(这是合乎逻辑的,因为我们没有要解引用的类型),因此,void 指针中的任何地址都需要转换为指向的其他指针类型取消引用之前的具体数据类型。

        void* 通常用于引用 unknown 类型的值。其他信息用于确定类型,void* 被强制转换为该类型,然后才能取消引用。

        这种行为在 C 中很常见,但是随着 C++ 的出现,最好使用模板来确定编译时已知的任何值的类型,void*s 仅在特殊情况下使用值类型必须在运行时确定。


        我最近学习了很多关于别名的知识,这可能进一步证明了 void* 的失宠,它没有被列为受支持的类型,而 char*unsigned char* 是:@987654323 @

        【讨论】:

        • @JohanLundberg Lol,我可能应该对此发表评论。我写的答案是考虑变量类型,而不是函数定义。
        【解决方案6】:

        一个在现代 C++ 中使用 void* 的例子,这没问题(我们当地的 C++ 大师说):

        在创建可移植代码时,您有时想知道您的代码是编译为 32 位还是 64 位,确定这一点的一种方法是检查 void* 的大小,因为它表示以字节为单位的地址大小。 当

        sizeof(void*)==8
        

        您知道您的代码编译为 64 位(8 字节)。以及何时

        sizeof(void*)==4
        

        你知道你的代码被编译为 32 位

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 1970-01-01
          • 1970-01-01
          • 2018-11-04
          • 1970-01-01
          相关资源
          最近更新 更多