加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 类型的编译时序

发布时间:2020-12-16 06:59:14 所属栏目:百科 来源:网络整理
导读:我一直在寻找一种在编译时获得类型排序的方法.例如,这对于实现(高效)编译时类型集很有用. 一种显而易见的方法是,如果有办法将每种类型映射到一个唯一的整数.关于该主题的previous question的答案简洁地捕捉了为什么这很困难,并且似乎它同样适用于尝试获得排
我一直在寻找一种在编译时获得类型排序的方法.例如,这对于实现(高效)编译时类型集很有用.

一种显而易见的方法是,如果有办法将每种类型映射到一个唯一的整数.关于该主题的previous question的答案简洁地捕捉了为什么这很困难,并且似乎它同样适用于尝试获得排序的任何其他方式:

the compiler has no way of knowing all compilation units and the linker has no concept of a type

实际上,对编译器的挑战是相当大的:它必须确保在任何调用中,对于任何源文件,它返回给定类型的相同整数/它在任何两个给定类型之间返回相同的顺序,但是在同时,类型的范围是开放的,它不知道当前文件之外的任何类型.一个难题.

我的想法是类型有名称.根据C的定律,据我所知,类型的完全限定名称在整个程序中必须是唯一的,否则您将获得某种或其他类型的错误或未定义的行为.

>如果两种类型具有相同的名称,则它们是相同的类型.
>如果两种类型的类型相同,则它们具有相同的名称,或者它们是彼此的typedef.编译器完全了解typedef.

名称是字符串,字符串具有排序.因此,如果我说得对,您可以根据名称在类型上定义全局一致的排序.更具体地说,任何两种类型之间的顺序是完全解析了typedef的类型名称之间的顺序. (类型行为与typedef不同会有问题.)

当然,标准C没有任何用于检索类型名称的工具.

我的问题是:

>我有什么不对吗?从理论上讲,这有什么理由不起作用吗?
>是否有任何编译器可以在编译时作为语言扩展访问类型的名称(理想情况下是他们的typedef-resolved表单)?
>还有其他办法吗?有没有编译器呢?

(我认识到在同一个问题中提出不止一个问题是不礼貌的,但是发布三个单独的问题并且在他们之前使用相同的基本喉咙清除似乎很奇怪.)

解决方法

the fully qualified name of a type must be unique across the entire program

但是,当然,如果你认为不同翻译单元中的单独匿名命名空间在某种意义上具有不同的名称,并且有某种方法可以弄清楚它们是什么,那么这是唯一的.

我知道它们确实有不同名称的唯一意义是错误的链接符号;你可能(取决于编译器)能够从type_info :: name()获得它,但是不能保证,仅限于带有RTTI的类型,并且无论如何似乎都没有被声明为constexpr所以你可以在编译时使用该值.

type_info :: before()产生的排序自然具有相同的限制.

出于兴趣,您希望通过编译时类型排序实现什么?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读