将别名定义为操作员



在C 中,我可以通过typedef语句为现有类型定义一个别名。但是,一个人可以为操作员创建一个别名吗?要具体来说,我想选择一些Unicode符号并为<<操作员创建一个别名。

我想使用例如"垂直四个点" U+205E

cout 
⁞ endl ⁞ "filename:      " ⁞ cfgfilename
⁞ endl ⁞ "message:       " ⁞ e.what() 
⁞ endl ⁞ "exception id:  " ⁞ e.id
⁞ endl ⁞ "byte position: " ⁞ e.byte ;   

而不是这样:

cout 
<< endl << "filename:      " << cfgfilename
<< endl << "message:       " << e.what() 
<< endl << "exception id:  " << e.id
<< endl << "byte position: " << e.byte ;   

如果四个点字符不可能,但是其他一些符号也可能是一个选项(尽管拥有比基本ASCII更多的选择是好的。

c 仅允许操作员被超载,而不是新定义的。因此,您可以重新定义<<的作用,但是您不能定义像这样的新操作员。

当然,这是在语言的演变中被考虑的,而Bjarne Stroustrup本人(写C 的人)解释了为什么他们决定不允许它:

我可以定义自己的操作员吗?

对不起,不。可能已经考虑了几次的可能性 时间我/我们认为可能的问题可能超过了可能的问题 好处。这不是语言技术问题。即使我第一次 考虑到1983年,我知道如何实施它。但是,我的 经验是,当我们超越最琐碎的例子时 人们似乎对"明显"的看法微妙 操作员使用的含义。一个经典的例子是** b ** c。认为 **已被认为是指凸起。现在应该是** b ** c的意思 (a ** b)** c或a **(b ** c)?我认为答案很明显,我的 朋友同意 - 然后我们发现我们不同意哪个 决议是显而易见的。我的猜想是这样的问题 会导致微妙的错误。

最好的方法是添加一个构建步骤,该步骤在将编译单元传递给编译器之前,将替换为CC_6。根据您的构建环境,使用make文件或同等的文件可能很简单。

致谢:我从这个答案中得到了很多灵感。

有一个可用于操作员超载的可用操作员列表。因此,您无法为您的自定义角色创建操作员,以使其成为您的自定义字符重载运算符。

除此之外,C 标准还定义了可用于编写程序的字符集。unicode字符在C 源文件中无效作为操作员过载的名称。