相关疑难解决方法(0)

什么构成"有效"C标识符?

在@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 syntax naming-conventions clang identifier

21
推荐指数
4
解决办法
2980
查看次数

在Visual Studio或GCC中使用表情符号作为c ++中的标识符名称

传统上,接受的字符我们可以如在C++是一个标识符的一部分使用_, a-z, A-Z0-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)

c++ compilation g++ visual-studio

14
推荐指数
1
解决办法
8758
查看次数

是否有可能让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变量名

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

它似乎不起作用.

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

谢谢!

variables unicode g++

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

有没有办法让 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
查看次数

不允许在clang中的变量名中使用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/.结果(对不起,如果它伤害你的眼睛): …

c++ unicode gcc clang

6
推荐指数
1
解决办法
3279
查看次数

为什么这些 Unicode 变量名称不能与 -fextended- 标识符一起使用?“, “ 和 ?

我听说可以使用 Unicode 变量名-fextended-identifiersGCC 中的标志来使用 Unicode 变量名。所以我用C++编写了一个测试程序,但它无法编译。

\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 = "";\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}\n
Run 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)

c++ unicode gcc variable-names

5
推荐指数
2
解决办法
5581
查看次数

流浪"\ 303"并在程序中迷失"\ 215" - 为什么?

我没有在我在这里找到的程序中迷路"\ 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

2
推荐指数
1
解决办法
3万
查看次数

cpp文件中的C++变量可以定义为特殊符号β

我们可以使用特殊字符在c ++/c中定义变量,例如;
双ε,μ,β,κ;

如果是,那怎么能实现呢?

c++ variables visual-c++ c++11

2
推荐指数
1
解决办法
361
查看次数