是否(不)可以在C源中使用特殊字符?

时间:2018-06-01 22:27:27

标签: c gcc utf-8

在某种程度上,我想在C项目的函数名中使用µ字符。这不可能吗?我得到像

这样的错误
error: stray '\302' in program

我尝试添加选项:

-fexec-charset=UTF-8
-finput-charset=UTF-8

到我的构建脚本,但我不能理解那些启用的内容。我正在运行此版本的gcc:

arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]

3 个答案:

答案 0 :(得分:2)

C标准要求实现在源字符集中包含以下字符:

A-Z a-z 0-9 ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

以及空格,水平制表符,垂直制表符和换页符的字符。它还需要一些指示行结束的方法,尽管这不一定是流内特征(C 2011 [N1570] 5.2.1 3)。实现可以扩展这个字符集,它们可以允许标识符中的其他字符,但是这些扩展是由每个实现定义的,而不是标准。

-finput-charset=…未指定要用于源字符集的字符集。 It specifies what the character set of the source input is, but that input is translated to GCC’s source character set.

Clang似乎接受μ作为标识符(在macOS和Compiler Explorer上测试),而GCC则没有。

答案 1 :(得分:1)

在大多数C语言实现中,函数的名称必须只包含字母数字字符和下划线。

答案 2 :(得分:1)

我在Mac下用两个不同的编译器尝试了这个(UTF-8编码)程序:

#include <stdio.h>

double π = 3.141592654;

int main()
{
    printf("π = %f\n", π);
}

正如其他人所报告的那样,gcc在节目中抱怨了一个“流浪”的'317'。但是clang接受了它并成功编译了它;当我运行生成的程序时,我得到了

π = 3.141593

底线:我认为它是实现定义的。