Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 结构的“类型”会随着计算机的不同而变化吗?_C++_Types - Fatal编程技术网

C++ 结构的“类型”会随着计算机的不同而变化吗?

C++ 结构的“类型”会随着计算机的不同而变化吗?,c++,types,C++,Types,假设我有这个代码 class Ingredients{ public: Ingredients(int size,string name); int getsize(); private: string name; int size; }; struct Chain{ Ingredients* ing; Chain* next; } 在我看来 int main() { cout<

假设我有这个代码

class Ingredients{
    public:
        Ingredients(int size,string name);
        int getsize();
    private:
        string name;
        int size;
};

struct Chain{
    Ingredients* ing;
    Chain* next;  
}
在我看来

int main()
{
    cout<<typeid(Chain).name()<<endl;
    cout<<typeid(Chain->ing).name()<<endl;
    cout<<typeid(Chain->next).name()<<endl; 

}
所以我的问题是,这种类型在代码中使用它是否可靠?如果类型因为P8和P12的原因而改变,我不确定从计算机到comp的类型是否相同。这种类型不可靠。你的意见是什么


而且它们不会在每次运行时都改变。

它们取决于编译器,所以不要在代码中使用它们

C++标准中涉及下列类型:

typeid表达式的结果是静态类型const std::type_info和动态类型const std::type_info或const name的左值,其中name是从std::type_info派生的实现定义的类

如果你想做点什么,你能做的就是


它们依赖于编译器,所以不要在代码中使用它们

C++标准中涉及下列类型:

typeid表达式的结果是静态类型const std::type_info和动态类型const std::type_info或const name的左值,其中name是从std::type_info派生的实现定义的类

如果你想做点什么,你能做的就是


根据标准,名称是实现定义以及根据Stroustrup书-参见第三版第415页

根据标准,名称是实现定义以及根据Stroustrup书-参见第三版第415页

它取决于您所指的类型。类型或多或少的标准定义是类型可以执行的一组值和操作,这将从一台机器更改到下一台机器,因为int的大小或字符串的最大长度将更改。另一方面,有一种非常真实的意义,即编译器和C++标准认为类型是什么,它大致上对应于,或者至少由范围名称标识。最后,std::type_info::name函数的规格严重不足。充其量,它可以用于调试,例如记录调用实际派生类a函数的日志,但并非所有编译器都提供这一功能。就标准而言,编译器可能总是返回空字符串,但仍然保持一致。

这取决于您所说的类型。类型或多或少的标准定义是类型可以执行的一组值和操作,这将从一台机器更改到下一台机器,因为int的大小或字符串的最大长度将更改。另一方面,有一种非常真实的意义,即编译器和C++标准认为类型是什么,它大致上对应于,或者至少由范围名称标识。最后,std::type_info::name函数的规格严重不足。充其量,它可以用于调试,例如记录调用实际派生类a函数的日志,但并非所有编译器都提供这一功能。就标准而言,编译器总是可以返回空字符串,并且仍然保持一致。

单词类型有多种含义

在类型理论方面,C++结构并没有真正定义一个类型。

更有用的是,C++语言标准以可严格采用的方式来讨论类型,即使它从来没有严格定义术语。在这些术语中,struct声明确实定义了一个唯一且一致的类型

也许更有用的是,对于C++编译器和C链接器,一种类型由诸如内存布局、被损坏的名称、成员名称和类型列表、指向特殊和普通成员函数的指针、可能指向VTABLE和/或RTTI信息的指针等表示。从实现到实现,这一点将不相同。在使用相同实现的构建之间,即使没有相关代码更改,指针指向的位置等细节也可能会更改,但您可能会定义一个有用的信息子集,可以有效地调用一个不变的类型

除此之外,本标准第18.5.1节定义的type_info实例不能在明确定义的范围内更改,而第5.2.8节定义的typeid的结果是该实例或与之相当的兼容对象。因此,在我看来,如果可以同时从两个不同的运行加载type_info实例,操作符==将必须返回true。但是,实际上不可能从两个不同的运行中加载type_info实例。例如,不要求它们以任何方式可序列化,因此这可能不相关

最后,第18.5.1节定义的typeid.name显示的名称就是NTB定义的任何实现。它可以在同一次运行中的构建、运行甚至调用之间进行更改。它可能总是空的。实际上,对于调试来说,它通常是一些模糊有用的东西,但这并不能保证 -而且,即使是这样,也不会有什么帮助,因为对于调试来说,模糊的有用并不一定意味着在一个运行中是唯一的,在整个运行中是持久的


如果您询问特定的编译器,编译器的文档可能会提供比标准要求更严格的保证。例如,我相信,在不同的平台上,G++保证它将使用在CODESUS中定义的C++ ABI,并且不会在小编译器版本中更改ABI版本,并且将使用在ABI中定义的被损坏的名称作为Type信息名。这意味着将二进制文件带到另一台计算机不会影响名称,甚至在具有相同平台和g++版本的另一台计算机上重新编译源代码也不会影响名称。

单词类型有多种含义

在类型理论方面,C++结构并没有真正定义一个类型。

更有用的是,C++语言标准以可严格采用的方式来讨论类型,即使它从来没有严格定义术语。在这些术语中,struct声明确实定义了一个唯一且一致的类型

也许更有用的是,对于C++编译器和C链接器,一种类型由诸如内存布局、被损坏的名称、成员名称和类型列表、指向特殊和普通成员函数的指针、可能指向VTABLE和/或RTTI信息的指针等表示。从实现到实现,这一点将不相同。在使用相同实现的构建之间,即使没有相关代码更改,指针指向的位置等细节也可能会更改,但您可能会定义一个有用的信息子集,可以有效地调用一个不变的类型

除此之外,本标准第18.5.1节定义的type_info实例不能在明确定义的范围内更改,而第5.2.8节定义的typeid的结果是该实例或与之相当的兼容对象。因此,在我看来,如果可以同时从两个不同的运行加载type_info实例,操作符==将必须返回true。但是,实际上不可能从两个不同的运行中加载type_info实例。例如,不要求它们以任何方式可序列化,因此这可能不相关

最后,第18.5.1节定义的typeid.name显示的名称就是NTB定义的任何实现。它可以在同一次运行中的构建、运行甚至调用之间进行更改。它可能总是空的。实际上,它通常对调试有一些模糊的用处,但这并不能保证,即使有,也不会有帮助,因为模糊的调试用处并不一定意味着在一次运行中是唯一的,也不意味着在整个运行中是持久的


如果您询问特定的编译器,编译器的文档可能会提供比标准要求更严格的保证。例如,我相信,在不同的平台上,G++保证它将使用在CODESUS中定义的C++ ABI,并且不会在小编译器版本中更改ABI版本,并且将使用在ABI中定义的被损坏的名称作为Type信息名。这意味着将二进制文件带到另一台计算机不会影响名称,甚至在具有相同平台和g++版本的另一台计算机上重新编译源代码也不会影响名称。

一旦编译程序,它们不会改变。关于使用不同的编译器编译时它们是否相同,我无法确定类型ID。名称不是类型,只是一个损坏的名称。假设它们都是在相同的g++上编译的,但不同的计算机上编译的,standard对此有什么说法吗?哦,没有规定类型名称是什么样子的。因此,不同的编译器会产生不同的结果。只有与同一程序中的另一个typeid相比,typeid才真正有用。在同一操作系统上使用同一编译器的同一版本的两台计算机几乎肯定会为一个typeid生成相同的名称,但即使这样也不是真的需要…Chain->ing不会编译。一旦程序被编译,它们也不会改变。关于使用不同的编译器编译时它们是否相同,我无法确定类型ID。名称不是类型,只是一个损坏的名称。假设它们都是在相同的g++上编译的,但不同的计算机上编译的,standard对此有什么说法吗?哦,没有规定类型名称是什么样子的。因此,不同的编译器会产生不同的结果。只有与同一程序中的另一个typeid相比,typeid才真正有用。在同一操作系统上使用同一编译器的同一版本的两台计算机几乎肯定会为一个typeid生成相同的名称,但即使这样也不是真的需要…Chain->ing不会编译。正如eran指出的,问题在于type_info::name成员函数参见§18.7.1/9 type_info::name:返回:一个实现定义的NTB。我听说有传言说有一个C++14提案要提交给m
让这个便携的,但我找不到它。它实际上是18.5.1描述了成员的名字;5.2.8仅描述如何获取类型_信息或兼容对象。否则,这是完美的。事实上,按照编写的标准,为每个类型的名称返回空字符串是完全合法的,这意味着您甚至不能依赖它作为程序员可读的类型描述来进行调试。@abarnert第5.2.8节谈到了typeid。这就是我写的。点击链接,你会看到:是的,typeid是如何获取类型信息的。我就是这么说的。标准中规定调用type_info对象的name的结果是返回一个实现定义的NTB的部分是18.5.1。PS,点击链接只是将整个内容下载为PDF格式,它不会显示任何特定部分。正如eran指出的,问题在于type_info::name成员函数参见§18.7.1/9 type_info::name:返回:一个实现定义的NTB。我听说有传言说有一个C++14的建议,使这个可移植,但我找不到它;5.2.8仅描述如何获取类型_信息或兼容对象。否则,这是完美的。事实上,按照编写的标准,为每个类型的名称返回空字符串是完全合法的,这意味着您甚至不能依赖它作为程序员可读的类型描述来进行调试。@abarnert第5.2.8节谈到了typeid。这就是我写的。点击链接,你会看到:是的,typeid是如何获取类型信息的。我就是这么说的。标准中规定调用type_info对象的name的结果是返回一个实现定义的NTB的部分是18.5.1。PS,点击链接只是将整个内容下载为PDF格式,它不会显示任何特定部分。+1用于解释字面上定义的类型实际上不会改变,但类型_info::name会改变。然而,我认为第三件事实际上比这两种类型都有用,也可能值得调用类型:两种类型是相同的,如果编译器和链接器实际上将它们视为等效的,这意味着特定于平台的名称、布局、,Abnntt就是我所说的后面的内容,有一种非常真实的感觉,即编译器和C++认为它是什么类型。但这只适用于法律C++。违反“一个定义”规则,未定义的行为可能会导致对类型的大量混淆。名称可能会被损坏,但可能的值和操作可能完全不同。当然,这个定义也意味着C和C++中的类型定义不同。我的观点是,C++实现的表示方式可能不同于,例如,一个构建到下一个,即使语言定义的类型不会。这就是为什么你不一定把两个C++文件链接在一起,如果它们是由不同编译器编译的,它们有不同的设置等等。由于这可能会影响到法律允许您在代码中查看的内容,甚至是完全合法的工作代码,因此这并不是纯理论性的。+1用于解释字面上定义的类型实际上不会改变,但类型\ u info::name会改变。然而,我认为第三件事实际上比这两种类型都有用,也可能值得调用类型:两种类型是相同的,如果编译器和链接器实际上将它们视为等效的,这意味着特定于平台的名称、布局、,Abnntt就是我所说的后面的内容,有一种非常真实的感觉,即编译器和C++认为它是什么类型。但这只适用于法律C++。违反“一个定义”规则,未定义的行为可能会导致对类型的大量混淆。名称可能会被损坏,但可能的值和操作可能完全不同。当然,这个定义也意味着C和C++中的类型定义不同。我的观点是,C++实现的表示方式可能不同于,例如,一个构建到下一个,即使语言定义的类型不会。这就是为什么你不一定把两个C++文件链接在一起,如果它们是由不同编译器编译的,它们有不同的设置等等。由于这可能会影响到法律允许您在代码中窥视的内容,甚至是完全合法和有效的代码,这不是纯粹的理论,只是一个我不确定是否同意的小问题。在C++中,但在C中,我认为结构至少定义了一种类型,至少是潜在的。类型定义的一部分是类型上可能的操作集。如果你的函数需要
T&或T常量&,它们是它上可能的操作的一部分。另一方面,这使得类型的定义有些开放。您可以随时在其上添加操作。键入哪些术语?我已经说过,一个结构定义了一个C++定义的类型,你是对的,这对C来说不是真的。你是说它也定义了一个类型理论定义的类型吗?如果是这样,那么,正如您所说,自由函数可以扩展类型这一事实意味着结构不可能定义类型。事实上,这就是自由函数是类接口思想的一部分背后的全部要点。只是一个我不确定是否同意的小问题。在C++中,但在C中,我认为结构至少定义了一种类型,至少是潜在的。类型定义的一部分是类型上可能的操作集。如果你有一个T&或T常量的函数,它们是它可能的操作的一部分。另一方面,这使得类型的定义有些开放。您可以随时在其上添加操作。键入哪些术语?我已经说过,一个结构定义了一个C++定义的类型,你是对的,这对C来说不是真的。你是说它也定义了一个类型理论定义的类型吗?如果是这样,那么,正如您所说,自由函数可以扩展类型这一事实意味着结构不可能定义类型。事实上,这就是自由函数是类接口思想的一部分背后的全部要点。
#include <iostream>
#include <typeinfo>

using namespace std;
P8Chain
P12Ingredients
P8Chain
if (typeid(myobject) == typeid(Chain)) {
    do_something();
}