运算符在C中重载

27 c operator-overloading

我试图重载一些运算符:

/* 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);
Run Code Online (Sandbox Code Playgroud)

我为每次尝试重载都收到此错误:

expected '=', ',', ';', 'asm' or '__attribute__' before '+' token
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 58

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

  • @LightnessRacesinOrbit 不,因为“语法糖”是“一种语言结构,旨在使代码更易于阅读或表达,而不影响功能或表达能力”。你不能在 Assembly 中表达结构、数组或引用(一些汇编器有扩展)。你_可以_用C表达引用,你只需要使用引用和解引用语法。 (3认同)
  • @YoYoYonnY:我想我对你对语法糖定义的解释有争议,语法糖似乎或多或少涵盖了整个 C++ 语言。我的基础是这种解释的可能的传递结果(整个宇宙都是语法糖)。我当然不会将 `const` 称为“语法糖”。但我承认我有一段时间没有阅读严格的定义了。 (3认同)
  • @Ali References只是语法糖.其他C++特性(如const,重载,命名空间和类)也是如此.它们不添加任何功能,只是添加其他方法来执行相同的操作.这并不意味着它们是多余的,但它也绝不意味着C++的功能无法在C中实现.C++可以做的事情,C也可以做,只是使用不同的语法(他们称之为'语法糖'是有原因的).在这个特殊情况下,用指针替换引用将完全正常. (2认同)
  • @YoYoYonnY:按照这种逻辑,_整个_C 语言和_整个_C++ 语言只是计算机指令集提供的设施的“语法糖”。 (2认同)

Jus*_*ini 23

C中没有运算符重载.

  • 当然有 - 例如,`-`,`+`,`/`,`*`,同样适用于`int`或`double`.它不支持的是添加超出内置的任何重载. (16认同)
  • 当然是.你的回答确实更明确. (2认同)

art*_*ise 17

你需要一台时间机器带你回到1985年,所以你可以使用程序CFront.似乎'C'用于支持运算符重载; 到足够复杂,它仍然可以.见里面的C++对象模型斯坦利·B·利普曼.OMG,C++是C!这样的事情仍然存在.

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

由Edward D. Willink撰写的论文" Meta-Compilation for C++",2001年有一些有趣的设计功能实例,其中扩展语言很有用.*nix shell脚本和make规则的组合通常允许这种转换.其他例子是Qt MOC,工具Lex和Yacc等.因此,虽然'C'本身不能直接适应这种情况,但如果您构建主机工具,它也可以.

在这个特定的例子中,重载可能没有意义.但是,对于需要任意精度数学的程序来说,这可能很有意义.


Pie*_*tte 15

你不能在C中重载这些运算符.


Rob*_*let 8

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

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

Colour colour_add(Colour c1, Colour c2);
Colour colour_substract(Colour c1, Colour c2);
...
Run Code Online (Sandbox Code Playgroud)

您也可以切换到C++,但仅仅为了重载可能有点过分.

  • 用C++编写C库会很有趣.包括头文件给出了即时错误:) (2认同)

bta*_*bta 5

C中没有运算符重载.相反,您必须使用函数来"伪过载"运算符:

Colour add_colours(Colour c1, Colour c2) {
    return c1 + c2; // or whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)