我是 😞发现我不能使用😃作为 g++ 4.7 的有效标识符,即使启用了 -fextended-identifiers
选项:
int main(int argc, const char* argv[])
{
const char* 😃 = "I'm very happy";
return 0;
}
main.cpp:3:3: error: stray ‘\360’ in program
main.cpp:3:3: error: stray ‘\237’ in program
main.cpp:3:3: error: stray ‘\230’ in program
main.cpp:3:3: error: stray ‘\203’ in program
经过一番谷歌搜索,我发现 UTF-8 characters are not yet supported in identifiers ,但是 universal-character-name 应该可以工作。所以我将我的源代码转换为:
int main(int argc, const char* argv[])
{
const char* \U0001F603 = "I'm very happy";
return 0;
}
main.cpp:3:15: error: universal character \U0001F603 is not valid in an identifier
显然 😃 不是有效的标识符字符。但是,该标准在附件 E.1 中明确允许 10000-1FFFD
范围内的字符,并且在 E.2 中不允许将其作为初始字符。
我接下来的工作是查看是否有任何其他允许的 Unicode 字符有效 - 但我尝试过的都没有。甚至最重要的 PILE OF POO (💩)字符。
那么,为了有意义和描述性的变量名称,什么给出了? -fextended-identifiers
是否像它所宣传的那样做?它仅在最新版本中支持吗?其他编译器有什么样的支持?
最佳答案
从 4.8 开始,gcc does not support characters outside of the BMP used as identifiers .这似乎是一个不必要的限制。此外,gcc 仅支持 ucnid.tab 中描述的一组非常有限的字符。 ,基于 C99 和 C++98(它似乎还没有更新到 C11 和 C++11)。
如手册中所述,-fextended-identifiers
is experimental ,因此它更有可能无法按预期工作。
编辑:
GCC 支持 C11 字符集 starting from 4.9.0 (准确地说是 svn r204886)。因此,OP 使用 \U0001F603
的第二段代码确实有效。即使使用 -finput-charset=UTF-8
和 GCC 8.2 on https://gcc.godbolt.org,我仍然无法使用 😃
获得实际代码。不过(您可能想关注 this bug report ,由 @DanielWolf 提供)。
同时,这两条代码都可以在 clang 3.3 上运行,除了 -std=c++11
之外没有任何选项。
关于c++ - 😃(和其他 Unicode 字符)在 g++ 不允许的标识符中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12692067/