如何使GCC支持中文(utf-8)的变量名、函数名?
知乎原文地址 作者:@狗屎咖啡
目前VS 和Clang都是支持utf-8的变量名、函数名,但 GCC不支持。
有人提意见,提了好几年了:UTF-8 support for identifier names in GCC
GCC并没有解决,但官方给了一个解决方案:FAQ - GCC Wiki
就是用这样一条脚本语句转换一下源文件
perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;'
这条语句的意思是将源文件按utf-8读取出来,大于128的unicode(不在ASCII里)都用16进制的Uxxxxxxxx的格式替代。
这种格式叫UCN。
实际上gcc内部还是将UCN转换成utf-8字符串,再加到符号表。却不支持原生的UTF-8符号,这个就有点搞笑了。
虽然有人会说,C、C++的标准里没有对UTF-8符号的支持,GCC不支持UTF-8符号是符合标准的。但是GCC从来就不是死守标准的乖宝宝对吧,加了不少扩展了。为啥这个不能扩展一下呢?
官方不加,咱可以同人一下嘛!
下面就告诉大家,怎么在GCC里加UTF-8符号的支持。
在libcpp/lex.c 里
1.加一个函数
bool is_utf8_char(cppchar_t c) { if (c > 0x80) return true; else return false; }
2.复制一份函数lex_identifier,命名为lex_utf8_identifier
if (! starts_ucn) { while (ISIDNUM (*cur)) { hash = HT_HASHSTEP (hash, *cur); cur++; } NORMALIZE_STATE_UPDATE_IDNUM (nst, *(cur - 1)); }
中ISIDNUM 改成 is_utf8_char:
if (! starts_ucn) { while (is_utf8_char (*cur)) { hash = HT_HASHSTEP (hash, *cur); cur++; } NORMALIZE_STATE_UPDATE_IDNUM (nst, *(cur - 1)); }
3.在函数 _cpp_lex_direct 中修改 switch 的 default
default: create_literal (pfile, result, buffer->cur - 1, 1, CPP_OTHER); break;
改为:
default: if (is_utf8_char(c)) { struct normalize_state nst = INITIAL_NORMALIZE_STATE; result->type = CPP_NAME; result->val.node.node = lex_utf8_identifier(pfile, buffer->cur - 1, false, &nst, &result->val.node.spelling); warn_about_normalization(pfile, result, &nst); } else { create_literal (pfile, result, buffer->cur - 1, 1, CPP_OTHER); } break;
OK!完工了。make bootstrap && make install 吧。
你就可以愉快地使用 UTF-8 变量,函数了。
成品:地址
2017-11-24
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为Python添加中文关键字
知乎原文地址 作者:@狗屎咖啡 swizl/cnpython 1.大部分语法,可以按下面方法加同义的中文token第1步. 编译pgencd到python的源代码目录下, ./configure make Parser/pgen 第2步. 修改 ./Grammar/Grammar,添加同义词并生成语法代码。 以while,else为例原文: while_stmt: 'while' test ':' suite ['else' ':' suite] 改为: while_stmt: ('while'|当) test ':' suite [('else'|另) ':' suite] 保存 ./Grammar/Grammar为UTF-8格式 执行 ./Parser/pgen ./Grammar/Grammar ./Include/graminit.h ./Python/graminit.c 虽然会提示错误,但输出是有效正确的。 其实pgen不支持UTF-8,这里 中文名 不需要用单引号或双引号,利用pgen的容错性,减少工作量。 2.还有一较复杂语法在/Python/ast.c 里有辅助解析 ...
- 下一篇
中文代码示例之Spring Boot 1.3.3演示
源码: program-in-chinese/jinxiaocun 由于这个演示项目成型于去年(详见中文编程的尝试历程小记), Spring Boot还是老版本. 尚未将其更新到最新版本, 先将其中的一些中文命名的部分小结在此. URL 如: /商品表 /单位表 实现方式见最后附上的"单位控制器"源码中的: @RequestMapping(value = "/单位表") 及 protected static final String URL = "单位表"; 类/方法/变量用中文命名 见后面附上的源码 jsp文件名, 以及jsp中的变量名 如"单位表.jsp"中的"${单位.名称}". 这需要"单位"类中的属性命名为"名称". 由于命名约定, 需要将接口以get/set开头. 数据库的表/列命名 下面是mysqldump的结果("单位"部分) DROP TABLE IF EXISTS `单位`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = u...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境