相关疑难解决方法(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++ 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
查看次数

在C++ 11中实现干净的lambda函数

我一直在玩新的C++ 11 lambda,并且完全指定模板参数的要求是一个真正的拖累.我的语法喜欢使用是类似于下面的内容:

#include <vector>
#include <algorithm>

struct foo
{
    void bar() {}
};

int main()
{
    vector<foo> v(10);

    for_each(v.begin(), v.end(), [](f) {f.bar();});
                                   ^^^
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以得到任何接近这个的东西吗?Boost的Phoenix库是可以的,但是调用成员函数的语法需要大量的样板 - 我想我是在C++ 11轻松调用成员函数以及Phoenix自动推断类型之后.

目前的想法

我已经了解了这个语法:

vector<foo> x(1);
vector<bar> y(1);
for_each(x.begin(), x.end(), [](_a f) {f->f();});
for_each(y.begin(), y.end(), [](_a b) {b->b();});
Run Code Online (Sandbox Code Playgroud)

哪个有效,但您必须添加每种类型的功能(例如ADD_AUTO_LAMBDA_SUPPORT(foo);).它还有一个限制,即所有支持的类型都不能有任何不明确的成员.

完整的代码是:

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

struct foo
{
    foo() : x(3) {}
    int x;
    void f() { cout << x << endl;}
}; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates c++11

9
推荐指数
2
解决办法
4204
查看次数

g ++ unicode变量名

我想在g ++中使用unicode变量名.

它似乎不起作用.

g ++不支持unicode变量名,...还是有一些unicode子集(我从中没有测试过).

谢谢!

variables unicode g++

8
推荐指数
2
解决办法
5607
查看次数

标签 统计

c++11 ×3

unicode ×3

c++ ×2

g++ ×2

gcc ×1

lambda ×1

syntax ×1

templates ×1

variables ×1