坚持下去,这将是漫长的!在提出我的问题之前,我需要解释一些事情。
根据C ++标准(以及this question and its answers中所述),编译器应该在标识符(变量,函数等)的名称中支持Unicode(甚至更准确地说是源中的UTF-8)知道Clang完全支持(我的意思是你可以使用UTF-8编码的源文件),GCC只有在标识符中使用\u
代码才支持它,但让我们假设我们生活在一个完美的世界中这适用于所有编译器。
太棒了!现在我不再需要用英语编写我的代码,最后可以用我的本地保加利亚语或者世界语来完成。毕竟,这是标准要求的重点。除此之外还存在一个巨大的问题。让我们看一些(不是真正有意义的)代码:
首先使用英文标识符(ASCII):
int i = 0;
while(i < 100)
{
auto f = static_cast<float>(i);
std::string currentName = "name_" + toString(f);
std::cout << getPrettyName(currentName) << ": " << getSalary(currentName) << std::endl;
}
然后在保加利亚语中使用标识符(因为它非常清楚地显示了问题):
int и = 0;
while(и < 100)
{
auto д = static_cast<float>(и);
std::string текущоИме = "име_" + превърниВНиз(д);
std::cout << красивоИме(текущоИме) << ": " << заплата(текущоИме) << std::endl;
}
正如您所看到的,由于关键字和标准库,第二个代码仍主要使用英语。这有两个问题:
这适用于所有不基于拉丁文字的语言:中文,阿拉伯语,俄语,印地语,......
显而易见的解决方案(至少对我而言)是C ++语言应该支持本地化关键字(和标准库类),以使整个Unicode标识符具有任何意义。 That has been done for ALGOL 68可能还有其他人,还有其他more modern examples in the same article。这样,保加利亚语中的代码看起来会更好并且更容易编写(我不会声称所使用的保加利亚语必须是这些):
цяло и = 0;
докато(и < 100)
{
авт д = статично_преобр<дробно>(и);
стд::низ текущоИме = "име_" + превърниВНиз(д);
стд::изх << красивоИме(текущоИме) << ": " << заплата(текущоИме) << стд::кред;
}
所以,关于问题:
using
可以使用标准库类(namespace стд { using низ = std::string; }
)但除了子类化之外没有办法处理方法(std::string::size()
- &gt; размер()
?) ?为了清楚起见,我并不是说对于不同的语言应该有不同的版本的C ++ - 更像是它应该可以同时支持所有语言一些设置或include
或其他任何东西,如果需要的话。
顺便说一句,我真的很想在世界语中看到C ++!
答案 0 :(得分:8)
不,关键字在C ++标准(C ++ 11,C ++ 14等)中得到修复。你不能改变它们(否则语言不再是C ++)。
您可以使用以下预处理器技巧:
#define стд std
(或者,正如您所评论的那样,using стд = std;
;但对于while
等适当的关键字,您可以&#34;仅使用预处理器替换&#34;它们。但我不确定这是否有效,而且我确实认为 非常坏主意。
C ++程序员期待标准中提到的名称。不要混淆他。
编程不是用近乎自然的语言编写的(这是Cobol的野心,它在这方面完全失败)。重点是编程很难,因此学习它需要ten years,所以你希望程序员能够使用英文看关键词和阅读英文技术文档。
答案 1 :(得分:5)
太棒了!现在我不再需要用英语编写我的代码,最后可以用我的本地保加利亚语或者世界语来完成。毕竟,这就是标准要求的重点。
我很确定不是。标准的要点似乎纯粹与可能生成此类符号的其他编程系统兼容。毕竟,规范不要求在任何地方接受实际的utf-8。它唯一需要的是gcc中支持的\u
转义。
- 现在根据标准实际允许/可能吗?我可能会遗漏一些东西......
醇>
不,不是。规范指定了确切的符号名称。
- 有没有办法以自己的方式以合适的方式制定解决方法?宏将适用于关键字,但这将是非常糟糕的。使用将工作的标准库类(名称空间стд{使用низ= std :: string;})但除了子类化之外没有办法处理方法(std :: string :: size() - &gt;размер()) ......还是在吗?
醇>
您可以使用#define
来覆盖它们,但显然它会适用于所有地方的相同名称,这很少适用。
- 如果不可能或甚至不考虑,那么应该如何向制定标准的C ++专家提出这个想法呢?
醇>
算了。这是非常糟糕的,边缘邪恶,想法。请记住,大多数代码都存在,或者至少有一天会被世界另一端的人保持或至少审查,他们拥有不同的母语。英语使这成为可能。从它切换将是非常非常糟糕的。至少对大型软件公司不利,并记住C ++标准委员会中的关键人物确实代表了大型软件公司。