在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 源文件中无效作为操作员过载的名称。