在C源代码中是否可以使用特殊字符?

yk9xbfzb  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(98)

我想在一个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]
mbzjlibv

mbzjlibv1#

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不接受。

wbrvyc0a

wbrvyc0a2#

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

rjee0c15

rjee0c153#

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

#include <stdio.h>

double π = 3.141592654;

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

正如其他人所报道的那样,gcc抱怨“程序中有一个“\317”。但clang接受了它,并成功地编译了它;当我运行结果程序时,我得到

π = 3.141593

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

相关问题