zoukankan      html  css  js  c++  java
  • [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("??/ ??' ??( ??) ??! ??< ??> ??-
    ");
    
            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
    ", buf);
    
            return 0;
    %>
    

    备考

    https://zh.wikipedia.org/wiki/三字符组与双字符组

  • 相关阅读:
    springMVC3学习(二)--ModelAndView对象
    springMVC3学习(一)--框架搭建
    JS作用域
    JS阻止事件冒泡
    Oracle常用函数
    Oracle中复制表结构和表数据
    转:JavaBean 、 Serverlet 总结
    form插件ajaxForm和ajaxSubmit方法传递对象参数说明
    http status 汇总
    浅谈HTTP中Get与Post的区别
  • 原文地址:https://www.cnblogs.com/zelos/p/7295259.html
Copyright © 2011-2022 走看看