在@Zaibis建议(以及相关的我自己的答案到什么是宏名的有效字符?,以及在标识符(和其他Unicode字符)不能用g ++允许))...
clang允许很多"疯狂"的角色..虽然我一直在努力找到很多押韵或理由 - 至于为什么有些人被允许(ϟツ⌘☁½),而其他人则不然(▶︎∀★©).
例如,以下所有编译A-OK(clang-700.1.76)
#define ?: // OK (Pile of poo)
#define ? @end // OK (HALFWIDTH BLACK SQUARE)
#define @interface // OK (NEGATIVE SQUARED LATIN CAPITAL LETTER K)
#define ? @protocol // OK (FULLWIDTH LATIN CAPITAL LETTER P)
Run Code Online (Sandbox Code Playgroud)
但以下都导致相同的编译器错误...
Macro name must be an identifier.
#define ? TEL
#define ? NO
#define ? UP
#define ? ==
#define APPLE
Run Code Online (Sandbox Code Playgroud)
clang的文档提到了这个问题,只说明......
...支持C99和C++中的扩展标识符.此功能允许标识符包含某些Unicode字符,如活动语言标准所指定; 这些字符可以使用UTF-8编码直接写入源文件,也可以使用通用字符名称(\ u00E0,\ U000000E0)引用.
所以,我想我在问......什么是"主动语言标准",我怎样才能找到合法标识符的权威来源.
我创建了以下代码 …
传统上,接受的字符我们可以如在C++是一个标识符的一部分使用_, a-z, A-Z和0-9第一个字符之后.
有没有办法配置Visual Studio或GCC接受表情符号作为标识符名称(或任何其他任意unicode字符)的一部分?
int a = 2, = 3;
++; *= 2;
int ?(int a, int b) {return a + b;}
cout << ?(a * , 3) << endl;
const double ? = 3.14159;
double ? = sin(? / 2.0);
Run Code Online (Sandbox Code Playgroud) 我使用Windows上的Microsoft Visual Studio和uBuntu Linux上的GCC开发C++交叉平台.
在Visual Studio中,我可以在我的代码中使用像" π "和" ² " 这样的unicode符号.Visual Studio始终将源文件保存为带有BOM(字节顺序标记)的UTF-8.
例如:
// A = ?.r²
double ? = 3.14;
Run Code Online (Sandbox Code Playgroud)
只有在我首先删除BOM时,GCC才会愉快地编译这些文件.如果我不删除BOM,我会收到以下错误:
wwga_hydutils.cpp:28:9:错误:在程序中迷路'\ 317'
wwga_hydutils.cpp:28:9:错误:在程序中迷失'\ 200'
这让我想到了这个问题:
有没有办法让GCC编译UTF-8文件而不先删除BOM?
我正在使用:
和:
编辑:
正如第一个评论者指出的那样,我的问题不是 BOM,而是在字符串常量之外使用非ascii字符.GCC不喜欢符号名称中的非ascii字符,但事实证明GCC与带有BOM的UTF-8完全兼容.
我想在g ++中使用unicode变量名.
它似乎不起作用.
g ++不支持unicode变量名,...还是有一些unicode子集(我从中没有测试过).
谢谢!
int test(int )
{
auto = 5;
+= ;
return ;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让 g++ 编译这个程序?我试过了g++ -fextended-identifiers -finput-charset=utf-8 -c utf8-test.cpp,我得到了这样的错误:
utf8-test.cpp:1:9: error: stray ‘\360’ in program
1 | int test(int )
| ^
Run Code Online (Sandbox Code Playgroud)
它适用于叮当声。
请注意,我通常不赞成在标识符中使用表情符号的做法。这只是用于测试目的的极限情况。虽然,我有一个类,命名为 ?pField 会非常好(使用 ZPField 的一个很好的类型别名,以节省每个人弄清楚如何输入它的痛苦)。
编辑: TLDR 答案似乎是 gcc 可能会在 gcc 10 中支持这一点,但现在不支持,这是一个已知问题。也不清楚标准是否需要这种支持,并且您可能需要使用\U转义的十六进制或 UCN 序列来指定标识符中的 Unicode 字符。
此问题具有可能无法在所有浏览器中正确显示的unicode文本.
clang现在(> 3.3)支持Unicode字符变量名 http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features.
然而一些特殊的角色仍然被禁止.
int main(){
double ? = 2.; // alpha, ok!
double ? = 99999.; // infinity, error
}
Run Code Online (Sandbox Code Playgroud)
赠送:
error: non-ASCII characters are not allowed outside of literals and identifiers
double ? = 99999.;
Run Code Online (Sandbox Code Playgroud)
?(alpha)和?(infinty)之间的根本区别是什么clang?前者是unicode而后者不是unicode但同时不是ASCII?
是否有解决方法或选项允许这组字符clang(或BTW in gcc)?
注意:1)?只是一个例子,有很多字符可能有用但也被禁止,比如?或?.2)我不是在问这个好主意,请把它作为技术问题.3)我对clang 3.4Linux 中的C++编译器感兴趣(gcc 4.8.3不支持这个).我gedit使用UTF-8编码和Unix/Linux行结束保存源文件.4)添加其他正常的第一个字符无济于事:_?
答案指向肯定的NO.确实不允许某些范围,也不会很快.为了进一步向完全疯狂迈进,我发现的最佳选择是使用有效看起来相同的角色.(现在,这个我承认可能不是一个好主意.)这些替代可以在这里找到 http://shapecatcher.com/.结果(对不起,如果它伤害你的眼睛): …
我听说可以使用 Unicode 变量名-fextended-identifiersGCC 中的标志来使用 Unicode 变量名。所以我用C++编写了一个测试程序,但它无法编译。
#include <iostream>\n#include <string>\n\n#define \xc2\xac !\n#define \xe2\x89\xa0 !=\n#define \xc2\xab <<\n#define \xc2\xbb >>\n\n/* uniq: remove duplicate lines from stdin */\nint main() {\n std::string s;\n std::string t = "";\n while (cin \xc2\xbb s) {\n if (s \xe2\x89\xa0 t)\n cout \xc2\xab s;\n t = s;\n }\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n我收到这些错误:
\n#include <iostream>\n#include <string>\n\n#define \xc2\xac !\n#define \xe2\x89\xa0 !=\n#define \xc2\xab <<\n#define \xc2\xbb >>\n\n/* uniq: remove duplicate lines from stdin */\nint main() {\n std::string s;\n std::string t …Run Code Online (Sandbox Code Playgroud) 我没有在我在这里找到的程序中迷路"\ 302" ,而是收到了错误消息:
algo.c:118: error: stray ‘\303’ in program
algo.c:118: error: stray ‘\215’ in program
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄明白,这是什么?
为了将来参考,stray'\ XXX'对编译器来说意味着一个难以理解的特征.解决方法是找到'\ XXX'字符(现在我发现它并不总是这个unicode,它不能是一个错误的定义,例如'## define'中的'##'),然后删除或纠正它.祝好运!
我们可以使用特殊字符在c ++/c中定义变量,例如;
双ε,μ,β,κ;
如果是,那怎么能实现呢?
c++ ×5
unicode ×4
g++ ×3
gcc ×3
c ×2
clang ×2
variables ×2
c++11 ×1
compilation ×1
emoji ×1
identifier ×1
syntax ×1
utf-8 ×1
visual-c++ ×1