这个问题是出于好奇而提出的,主要是一种心理练习:
根据C++标准(以及this question and its answers中的描述),编译器应该在标识符(变量,函数等)的名称中支持Unicode(甚至更精确地说,源代码中的UTF-8)我知道Clang完全支持(我的意思是你可以使用UTF-8编码的源文件),GCC只有在标识符中使用\u
代码时才支持它,但让我们假设这直接适用于所有编译器上的utf-8。
太棒了!现在我不再需要用英语写代码了,我终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是标准的要求。当然,这只是一个笑话,但我只是很好奇,想知道这可以延伸到什么程度。为了说明这一点,让我们采用以下(纯粹的示例)代码:
首先使用英文标识符(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;
}
正如您所看到的,由于关键字和标准库的原因,第二段代码仍然主要使用英语。如果我们假设这个功能的目标是让非英语母语的人更容易编码,那么:
1.大多数仍然是英语的,所以人们仍然需要了解英语才能成为合适的程序员
1.如果我们接受这一点,这仍然是非常恼人的写作时,使用脚本以外的拉丁文(如西里尔文,但也有人)。它需要不断切换,这是缓慢的。
看起来这个特性是有用的, C++ 应该支持本地化的关键字和标准库类。这已经为ALGOL 68和其他可能的语言做过了。让我们看看这在保加利亚语中是什么样子的(用我自己翻译的关键字):
цяло и = 0;
докато(и < 100)
{
авт д = статично_преобразуване<дробно>(и);
стд::низ текущоИме = "име_" + превърниВНиз(д);
стд::изх << красивоИме(текущоИме) << ": " << заплата(текущоИме) << стд::кред;
}
仍然要记住,这只是一个心理练习,看看人们对这些问题的看法会很有趣:
1.根据目前的标准,这实际上是允许/可能的吗?我可能漏掉了什么...
1.有没有办法让我自己以一种体面的方式来解决这个问题?宏将工作的关键字,但这将是可怕的。using
可以处理标准库类(namespace стд { using низ = std::string; }
),但没有办法处理方法(std::string::size()
-> размер()
?)除了子类化.还是有?
1.如果这是不可能的,甚至是不考虑的,那么应该如何向制定标准的C++Maven提出这个想法呢?
2条答案
按热度按时间b91juud31#
不,关键字在C标准中是固定的(C11,C14等)。你不能改变它们(否则语言将不再是C)。
您可以使用预处理器技巧,如:
(or正如你所说,
using стд = std;
;但是对于像while
这样的关键字,你只能用预处理器来“替换”它们)。但我不确定这是否有效,我真的相信这是一个非常坏的主意。一个C++程序员期待标准中提到的名字。别把他弄糊涂了
编程不是用一种接近自然的语言来编码(这是Cobol的野心,它在这方面完全失败了)。关键是编程很难,所以需要ten years来学习它,所以你确实希望程序员能够使用英文关键字并阅读英文技术文档。
bhmjp9jg2#
太棒了!现在我不再需要用英语写代码了,我终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是标准的要求。
我很确定不是。该标准的重点似乎纯粹是与其他可能生成此类符号的编程系统兼容。毕竟,该规范并不要求在任何地方都接受实际的utf-8。它唯一需要的是gcc支持的
\u
转义。1.根据目前的标准,这实际上是允许/可能的吗?我可能漏掉了什么...
不,不是的。规范指定了确切的符号名称。
1.有没有办法让我自己以一种体面的方式来解决这个问题?宏将工作的关键字,但这将是可怕的。using可以处理标准库类(namespace стд { using ни н = std::string;})但是除了子类化之外,没有办法处理方法(std::string::size()-> ра т а р ер()).或者有吗?
您可以用
#define
s来覆盖它们,但显然它将适用于所有地方的相同名称,这很少是合适的。1.如果这是不可能的,甚至是不考虑的,那么应该如何向制定标准的CMaven提出这个想法呢?
算了吧。这是个非常坏的,近乎邪恶的主意。请记住,大多数代码都是由世界另一端的人维护的,或者至少是由世界另一端的人审查的,他们拥有不同的母语。英语使之成为可能。从它转换将是非常,非常糟糕。至少对大型软件公司来说是不好的,请记住,C标准委员会的关键人物确实代表着大型软件公司。