相关疑难解决方法(0)

(和其他unicode字符)在g ++不允许的标识符中

我是 发现我不能用 作为g ++ 4.7的有效标识符,即使-fextended-identifiers启用了该选项:

int main(int argc, const char* argv[])
{
  const char*  = "I'm very happy";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp:3:3:错误:stogram'\ 360'在程序
main.cpp中:3:3:错误:stray'\ 237'在程序
main.cpp中:3:3:错误:stray'\'230'in程序
main.cpp:3:3:错误:在程序中迷路'\ 203'

经过一些谷歌搜索后,我发现标识符中尚不支持UTF-8字符,通用字符名称应该有效.所以我将我的源码转换为:

int main(int argc, const char* argv[])
{
  const char* \U0001F603 = "I'm very happy";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp:3:15:错误:通用字符\ U0001F603在标识符中无效

所以显然不是有效的标识符字符.但是,该标准特别允许来自10000-1FFFD附件E.1 范围内的字符,并且不允许它作为E.2中的初始字符.我的下一个努力是看看是否有任何其他允许的unicode字符工作 - 但我没有尝试过.甚至不是重要的PILE OF POO()角色.

那么,为了有意义和描述性的变量名称,给出了什么?请问-fextended-identifiers这样做,因为它会公布或不?它是否仅在最新版本中得到支持?其他编译器有什么样的支持?

c++ unicode gcc g++ c++11

56
推荐指数
3
解决办法
8384
查看次数

函数名称和原型中的斜线和点?

我是C的新手,看着Go的源代码树,我发现了这个:

https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c

void runtime?race·Read(int32 goid, void *addr, void *pc);
void runtime?race·Write(int32 goid, void *addr, void *pc);

void
runtime·raceinit(void)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

斜线和点(·)是什么意思?这是有效的C吗?

c notation go

18
推荐指数
3
解决办法
2340
查看次数

C++ 11中的Unicode标识符和源代码?

我在新的C++标准中找到了

2.11 Identifiers                  [lex.name]
identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined character
Run Code Online (Sandbox Code Playgroud)

附加文字

标识符是任意长的字母和数字序列.标识符中的每个通用字符名称应指定一个字符,其ISO 10646中的编码属于E.1中规定的范围之一.[...]

我无法理解这意味着什么.从旧的标准我习惯\u89ab,例如写一个"通用字符名称" .但是在标识符中使用那些......?真?

新标准对Unicode更加开放吗?而且我没有提到新的文字类型 "uHello \u89ab thing"u32,我想我理解了这些.但:

  • Can(可移植)源代码可以是任何unicode编码,如UTF-8,UTF-16或任何(如何定义的)代码页?
  • 我可以\u1234在里面写一个标识符myfu\u1234ntion(出于任何目的)
  • 或者我可以使用unicode在ICU中定义的"字符名称",即

    const auto x = "German Braunb\U{LOWERCASE LETTER A WITH DIARESIS}r."u32;
    
    Run Code Online (Sandbox Code Playgroud)

    甚至在源本身的标识符中?这将是一种享受...... 咳嗽 ......

我认为答案给所有thise问题是没有,但我不能在标准的可靠映射这措辞... :-)

编辑:我找到了"2.2翻译阶段[lex.phases]",第1阶段:

如果需要,物理源文件字符以实现定义的方式映射到基本源字符集[...].接受的物理源文件字符集是实现定义的.[...]任何不在基本源字符集(2.3)中的源文件字符都将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)

通过阅读本文,我现在认为,编译器可以选择接受UTF-8,UTF-16或它希望的任何代码页(通过元信息或用户配置).在阶段1中,它将其转换为ASCII格式("基本源字符集"),然后用其\uNNNN符号替换Unicode字符(或者编译器可以选择继续以其Unicode表示形式工作,但不得不确保它\uNNNN以相同的方式处理另一个.

你怎么看?

unicode syntax c++11

12
推荐指数
1
解决办法
7592
查看次数

是否有可能让GCC用BOM源文件编译UTF-8?

我使用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?


我正在使用:

  • Windows 7的
  • Visual Studio 2010

和:

  • uBuntu Oneiric 11.10
  • GCC 4.6.1(由apt-get install gcc提供)

编辑:

正如第一个评论者指出的那样,我的问题不是 BOM,而是在字符串常量之外使用非ascii字符.GCC不喜欢符号名称中的非ascii字符,但事实证明GCC与带有BOM的UTF-8完全兼容.

gcc byte-order-mark g++ utf-8

12
推荐指数
1
解决办法
9070
查看次数

有没有办法让 g++ 用 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 字符。

c++ unicode emoji

7
推荐指数
0
解决办法
113
查看次数

标签 统计

unicode ×3

c++ ×2

c++11 ×2

g++ ×2

gcc ×2

byte-order-mark ×1

c ×1

emoji ×1

go ×1

notation ×1

syntax ×1

utf-8 ×1