我使用Windows上的Microsoft Visual Studio和uBuntu Linux上的GCC开发C ++交叉平台。
在Visual Studio中,我可以在代码中使用“π”和“²”等unicode符号。 Visual Studio始终将源文件保存为带有BOM(字节顺序标记)的UTF-8。
例如:
// A = π.r²
double π = 3.14;
只有在我首先删除BOM时,GCC才会愉快地编译这些文件。如果我不删除BOM,我会收到如下错误:
wwga_hydutils.cpp:28:9:错误:程序中错误'\ 317'
wwga_hydutils.cpp:28:9:错误:程序中错误'\ 200'
这让我想到了这个问题:
有没有办法让GCC在没有先移除BOM的情况下编译UTF-8文件?
我正在使用:
和
修改
正如第一位评论者指出的那样,我的问题是不 BOM,但是在字符串常量之外有非ascii字符。 GCC不喜欢符号名称中的非ascii字符,但事实证明GCC与带有BOM的UTF-8完全兼容。
答案 0 :(得分:3)
虽然gcc支持unicode标识符,但UTF-8输入不支持。因此,必须使用\ uXXXX和\ UXXXXXXXX转义码对unicode标识符进行编码。但是,cpp预处理器的简单单行补丁允许gcc和g ++处理UTF-8输入,前提是还安装了支持C99转换的最新版iconv。详情见
https://www.raspberrypi.org/forums/viewtopic.php?p=802657
然而,补丁非常简单,可以在这里给出。
diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c
*** gcc-5.2.0/libcpp/charset.c Mon Jan 5 04:33:28 2015
--- gcc-5.2.0-ejo/libcpp/charset.c Wed Aug 12 14:34:23 2015
***************
*** 1711,1717 ****
struct _cpp_strbuf to;
unsigned char *buffer;
! input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
if (input_cset.func == convert_no_conversion)
{
to.text = input;
--- 1711,1717 ----
struct _cpp_strbuf to;
unsigned char *buffer;
! input_cset = init_iconv_desc (pfile, "C99", input_charset);
if (input_cset.func == convert_no_conversion)
{
to.text = input;
即使使用补丁,也需要两个命令行选项来启用UTF-8输入。特别是尝试像
这样的东西$ /usr/local/gcc-5.2/bin/gcc \
-finput-charset=UTF-8 -fextended-identifiers \
-o circle circle.c
答案 1 :(得分:2)
根据GCC Wiki,目前尚不支持此功能。您可以使用-fextended-identifiers
并预处理代码以将标识符转换为UCN。从链接页面:
perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;'
另请参阅g++ unicode variable name和Unicode Identifiers and Source Code in C++11?