Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能在MSVC++;std图书馆?_C++_Arrays_Visual Studio 2010_Typeinfo - Fatal编程技术网

C++ 有人能在MSVC++;std图书馆?

C++ 有人能在MSVC++;std图书馆?,c++,arrays,visual-studio-2010,typeinfo,C++,Arrays,Visual Studio 2010,Typeinfo,在类型为\u info的Visual Studio实现中,通常位于C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\include\typeinfo中: class type_info { /* ... */ _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const; /* ... */ private:

在类型为\u info的Visual Studio实现中,通常位于C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\include\typeinfo中:

class type_info {
    /* ... */

    _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const;

    /* ... */

private:
    void *_M_data;
    char _M_d_name[1];
    __CLR_OR_THIS_CALL type_info(const type_info& _Rhs);

   /* ... */

};
我注意到等式运算符==的实现使用字符指针_M_d_name+1。有谁能向我解释一下它是如何工作的,因为它似乎超出了数组的界限

实现,C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\crt\src\ti_inst.cpp:

ASSERT_UNMANAGED_CODE_ATTRIBUTE
SECURITYSAFECRITICAL_ATTRIBUTE
bool type_info::operator==(const type_info& rhs) const
{
        return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1);
}

谢谢

此技巧适用于灵活数组成员。它将为
类类型\u info
和名称字符串分配内存,因此
(rhs.\u M\u d\u name)+1
正是名称字符串所在的位置。下面是一个图表来描述它:

        +------------+ --+           
        |            |   |           
        +------------+               
        |            |   |           
        |            |    ->type_info
        +------------+   |           
+-------+  _M_d_name |   |           
|       +------------+ --+           
+------->            |               
        |            |               
        |            |               
        +------------+               

事实上,c99支持此功能,这基本上是一种编写可变长度结构的方法。请记住,这是“实现”的一部分,其中还包括编译器等,因此他们可以自由地执行自己喜欢的操作,包括使用未定义的行为。。。定义。@T.C.谢谢您的评论。有没有可能你能详细阐述一下?“BeimMaules没有任何东西能让这个行为‘C++’定义”;只是在实现的上下文中,他们知道它在实践中会做什么。@LightnessRacesinOrbit:这已经是他的观点了:在VC++中定义行为就足够了。它不需要在标准C++中定义