代码之家  ›  专栏  ›  技术社区  ›  void.pointer

如何在C中对内置类型进行别名?

  •  14
  • void.pointer  · 技术社区  · 14 年前

    所以在C++中,我已经习惯了:

    typedef int PeerId;
    

    这允许我使一个类型更具自记录性,但另外还允许我在任何时候使peerid表示不同的类型,而不更改所有代码。如果我愿意的话,我甚至可以把peerid变成一个班级。这种可扩展性正是我在C中想要的,但是我很难理解如何在C中为“int”创建别名。

    我想我可以使用using语句,但是它在我认为当前文件中只有作用域,所以这不起作用(别名需要在多个文件之间可以访问,而不需要重新定义)。我也不能从内置类型派生类(但通常这是我对alias-ref类型(如list或dictionary)所做的操作)。我不知道我能做什么。有什么想法吗?

    5 回复  |  直到 14 年前
        1
  •  7
  •   Matthew Flaschen    14 年前

    您可以(AB)使用隐式转换:

    struct PeerId
    {
        private int peer;
    
        public static implicit operator PeerId(int i)
        {
            return new PeerId {peer=i};
        }
    
        public static implicit operator int(PeerId p)
        {
            return p.peer;
        }
    }
    

    这与int使用相同的空间,可以执行以下操作:

    PeerId p = 3;
    int i = p;
    

    但我同意你可能不需要这个。

        2
  •  17
  •   ChaosPandion    14 年前

    您需要使用这样的完整类型名:

    using DWORD = System.Int32;
    
        3
  •  11
  •   Stephen Cleary    14 年前

    总结

    下面是简短的回答:

    • typedef实际上是编译时代码生成器使用的变量。
    • C的设计目的是避免添加代码生成语言构造。

    因此,typedef的概念不适合C语言。

    长回答

    在C++中,它更有意义:C++作为一个预编译程序启动,将C代码吐出,然后编译。这种“代码生成器”在现代C++特性中仍然起作用(即,模板本质上是一种在编译时生成类和函数的图灵完整语言)。在这种情况下,typedef是有意义的,因为它是获取编译时类型工厂的“结果”或“返回”类型的“算法”的一种方法。

    在这种奇怪的元语言中(在Boost之外很少有人掌握),typedef实际上是一个变量。

    您所描述的并不那么复杂,但您仍然试图将typedef用作变量。在本例中,它被用作输入变量。所以当其他代码使用typedef时,它实际上并没有直接使用该类型。相反,它充当编译时代码生成器,基于typedef的输入变量构建类和方法。即使忽略C++模板,只看C类型DEFS,效果也是一样的。

    C++与生成程序设计

    C++被设计成一种多悖论语言(OO和过程,但直到Boost推出才起作用)。有趣的是,模板已经进化出了一个意想不到的悖论:生成式编程。(生成编程是在C++之前进行的,但是C++使它很流行)。生成程序实际上是元程序,在编译时生成所需的类和方法,这些类和方法又被编译成可执行文件。

    C和生成式编程

    我们的工具正朝着同一个方向缓慢发展。当然,reflection emit可以用于“手动”生成编程,但这是非常痛苦的。LINQ提供者使用表达式树的方式在本质上具有很强的生成性。T4模板非常接近,但仍然不足。“编译器即服务”(compiler as a service)有望成为C_vNext的一部分,如果它可以与某种类型变量(如typedef)组合,那么它似乎是最有前途的。

    这个拼图的一部分是 still missing 生成程序需要某种类型的自动触发机制(C++),这是由 隐式模板实例化 )

    然而,它是明确的 C语言的目标是在C语言中有任何类型的“代码生成器”,比如C++模板(可能是为了理解,很少有C++程序员理解C++模板)。这很可能是一个由t4而不是c_满足的利基。

    结论(重复总结)

    以上都是这样说的:

    • typedef是代码生成器使用的变量。
    • C的设计目的是避免添加代码生成语言构造。

    因此,typedef的概念不适合C语言。

        4
  •  3
  •   dan_din_pantelimon    8 年前

    有时我也觉得我需要(整型)typedef用于与op类似的目的。

    如果你不介意这些演员的直白(我实际上希望他们是这样),你可以这样做:

    enum PeerId : int {};

    也适用于 byte, sbyte, short, ushort, uint, long, ulong (显然)。

    不完全符合 enum 但它确实有效。

        5
  •  1
  •   Igor Zevaka    14 年前

    仅仅为了改变名字而重新定义基本类型是C++思维,而不是更纯的面向对象C++。每当你有把一个概念从一种语言推到另一种语言的冲动时,你必须停下来思考它是否有意义,并努力保持平台的本土化。

    通过定义自己的值类型,可以满足轻松更改基础类型的要求。再加上隐式转换运算符和算术运算符,您可以定义非常强大的类型。如果您担心在简单类型的基础上添加层的性能,则不会有0.99%的可能性,1%的可能性是,如果有,则不会是性能优化的“低挂果”。