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

在某种程度上,我想在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] 

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

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

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

-finput-charset=…不指定要用于源字符集的字符集。 它指定源输入的字符集是什么,但该输入被转换为GCC的源字符集。

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

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

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

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

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

 π = 3.141593 

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