【问题标题】:Operator overloading in CC中的运算符重载
【发布时间】:2011-03-25 22:46:54
【问题描述】:

我正在尝试重载一些运算符:

/* Typedef is required for operators */
typedef int Colour;

/* Operators */
Colour operator+(Colour colour1, Colour colour2);
Colour operator-(Colour colour1, Colour colour2);
Colour operator*(Colour colour1, Colour colour2);
Colour operator/(Colour colour1, Colour colour2);

每次尝试重载时都会出现此错误:

expected '=', ',', ';', 'asm' or '__attribute__' before '+' token

我找不到任何关于运算符重载的好文档。谷歌搜索的结果是使用类的 C++ 教程。在 C 中没有类。谁能帮我?谢谢。

【问题讨论】:

  • 只是不要:)。 struct RGB {int8_t red, green, blue;}; 有什么问题。你真的需要所有的元数据吗?
  • 即使 C 支持运算符重载:operator* 和 operator/ 对颜色有意义吗?
  • @Doc Brown- 为什么没有意义?一旦运算符重载,它们可能意味着任何东西,而不仅仅是“乘”和“除”。
  • @bta:同意,但是当它们不意味着乘除时,为什么还要为重载而烦恼呢?即使在 C++ 中,当运算符不符合其原始含义时,使用运算符重载也是非常糟糕的风格。
  • "operator* 和 operator/ 对颜色有意义吗?"也许是 Alpha(预)乘法?

标签: c operator-overloading


【解决方案1】:

您需要time machine 带您回到1985,以便您可以使用程序CFront。似乎“C”用于支持运算符重载;到足够复杂的时候它仍然可以。请参阅 Stanley B. LippmanInside the C++ Object Model。天哪,C++ 是 C!这样的a thing依然存在。

这个答案证实了其他答案。 'C' 本身并不直接支持重载。但是,重要的一点是程序员可以编写能够理解代码的代码。您需要一个转换源代码的工具来实现这一点。在这种情况下,此类工具已经存在。

Edward D. Willink 的一篇论文 Meta-Compilation for C++, 2001 有一些有趣的设计功能示例,其中扩展语言很有用。 *nix shell 脚本和make 规则的组合通常允许这样的转换。其他示例是 Qt MOC、Lex 和 Yacc 工具、halide 等。因此,虽然“C”本身不能直接适应这种情况,但如果你构建 host工具。

在这个特定的例子中,重载可能没有意义。但是,对于需要 arbitrary precision math 的程序来说,这可能很有意义。

【讨论】:

  • 也许重要的是,运算符重载可以通过将 C++ 语法“翻译成可以直接编译的 C”等价物来支持。并非所有 C++ 语言功能都易于翻译,并且需要链接器和其他运行时编译器支持。例如,C++11 及更高版本的新模板和功能。
  • red/black != blue*pink... 不太确定原始帖子的用例。此外,您有不同类型的“颜色添加”。颜料、染料不同于光源(可能是 OP 概念),因为它与当前的计算机显示技术有关。
【解决方案2】:

C 根本不支持运算符重载。

您只能将操作实现为函数:

Colour colour_add(Colour c1, Colour c2);
Colour colour_substract(Colour c1, Colour c2);
...

您也可以切换到 C++,但仅仅为了重载而这样做可能有点矫枉过正。

【讨论】:

  • 用 C++ 编写 C 库会很有趣。包含头文件会立即出错:)
  • 实际上,这是一个相当简单的任务——你只需要以正确的方式去做(所有这些#ifdef __cplusplus \ extern "C" { \ #endif stuff...)。当然,在 extern "C" 块中,您只能提供 C 允许的内容,这意味着,a。 o.,没有运算符重载了......
【解决方案3】:

如果您想要比较简洁,使用宏是最好的选择:

void Type_getSomething(int id); //or some other complex series of instructions

#define g(id) Type_getSomething(id)

...很遗憾,宏不能使用方括号!

【讨论】:

    【解决方案4】:

    运算符重载在 C 中不可用。相反,您必须使用函数来“伪重载”运算符:

    Colour add_colours(Colour c1, Colour c2) {
        return c1 + c2; // or whatever you need to do
    }
    

    【讨论】:

      【解决方案5】:

      C 不支持运算符重载(超出它内置的语言)。

      【讨论】:

      • 因为你在 C 中没有引用!
      • @Ali 引用只是语法糖。其他 C++ 特性也是如此,例如 const、重载、命名空间和类。他们没有添加任何功能,他们只是添加了其他方法来做同样的事情。这并不意味着它们是多余的,但这也绝对不意味着 C++ 特性不能在 C 中实现。C++ 可以做的所有事情,C 也可以做,只是语法不同(他们称它为“语法糖”是有原因的)。在这种特殊情况下,用指针替换引用会非常好。
      • @YoYoYonnY:按照这种逻辑,整个 C 语言和整个 C++ 语言只是所提供工具的“语法糖”由您的计算机的指令集。
      • @LightnessRacesinOrbit 不,因为“语法糖”是“一种语言结构,旨在使代码更易于阅读或表达,而不影响功能或表达能力”。您不能在汇编中表达结构、数组或引用(一些汇编器有扩展)。你可以在 C 中表达引用,你只需要使用引用和解引用语法。
      • @YoYoYonnY:我想我在质疑你对语法糖定义的解释,语法糖似乎或多或少包含了整个 C++ 语言。我基于这种解释的可能传递结果(整个宇宙都是句法糖)。我当然不会称const为“语法糖”。但我承认我有一段时间没有阅读严格的定义了。
      【解决方案6】:

      C 中没有运算符重载。

      【讨论】:

      • 当然有——例如,-+/*,都同样适用于intdouble。它不支持添加任何超出内置内容的重载。
      【解决方案7】:

      您不能在 C 中重载这些运算符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 2016-06-16
        • 2011-08-23
        相关资源
        最近更新 更多