[gcc warnings] -Wtrigraph warnings

[gcc warnings] -Wtrigraph warnings

背景

三字符组(trigraph)与双字符组(Digraph)是程序设计语言(如C语言)中3个或者2个字符的序列,在编译器预扫描源程序时被替换为单个字符。以解决某些键盘不能输入某些编程必须的字符问题。

三字符组

为解决上述的C语言源代码输入问题,C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符

三字符组替换为
??=#
??/\
??'^
??([
??)]
??!|
??<{
??>}
??-~

sample code

??=include<stdio.h>
??=include<string.h>

int main(int argc, char **argv) ??<

        char buf??(100??) = ??< 0 ??>;

        printf("??/ ??' ??( ??) ??! ??< ??> ??-\n");

        return 0;
??>
  • gcc 默认不支持trigraph,需要编译的时候加上-trigraphs作为编译参数不然会出现下面的类似编译warning
trigraph.c:1:1: warning: trigraph ??= ignored, use -trigraphs to enable [-Wtrigraphs]

二字符组

不同于三字符组在源文件的任何出现都会被预处理器替换,双字符如果出现在字符串字面值(quoted string)、字符常量、程序注释中将不被替换。双字符组的替换发生在编译器对源程序的tokenization阶段(即识别出关键字、标识符等,类似于自然语言的“断词”),仅当双字符组作为一个token或者token的组成部分时(如%:%:被替换为预处理运算符##),双字符组才被替换为单字符。

双字符组替换为
<:[
:>]
<%{
%>}
%:#

sample code

%:include <stdio.h>
%:include <stdlib.h>
%:include <string.h>

int main(int argc, char**argv) <%

        char buf<:100:> = <% 0 %>;
        char *hello = "hello world";

        memcpy(buf, hello, strlen(hello));

        printf("%s\n", buf);

        return 0;
%>

备考

https://zh.wikipedia.org/wiki/%E4%B8%89%E5%AD%97%E7%AC%A6%E7%BB%84%E4%B8%8E%E5%8F%8C%E5%AD%97%E7%AC%A6%E7%BB%84

posted on 2017-08-06 16:55 secularbird 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zelos/p/7295259.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值