[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/三字符组与双字符组
[gcc warnings] -Wtrigraph warnings的更多相关文章
- gcc cc1: all warnings being treated as errors
		
cc1: all warnings being treated as errors 在Makefile中找到 -Werror项,删除即可.删除后重新编译. 或设置环境变量 c工程设置 export C ...
 - gcc/g++ disable warnings in particular include files
		
当在编译一个大项目的时候,你想打开所有的Warning,但是打开后发现一堆公共库文件都出现了warning报错.此时如果你想忽略公共库头文件中的warning报错,只需要在编译的时候,将公共库头文件的 ...
 - iOS:消除项目中警告
		
引言: 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak.循环引用.不能执行之类的警告. 有代码洁癖的孩子们很想消除他们, 今天就让我们来一次Fuck 警告!! 首先学会基本的语句: ...
 - Sphinx 2.2.11-release reference manual
		
1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...
 - [Delphi] Delphi版本号对照
		
VER300 Delphi Seattle / C++Builder Seattle 23 230 (Delphi:Win32/Win64/OSX/iOS32/iOS64/An ...
 - Spill data to tempdb
		
查看Execution Plan时,在Sort Operator上,发现一个Warning:Operator used tempdb to spill data during execution wi ...
 - docker 源码分析 五(基于1.8.2版本),Docker容器的创建
		
前面讲到了docker容器得镜像,镜像其实是docker容器的静态部分,而docker容器则是docker镜像的动态部分,即启动了一个进程来运行,本篇最要来分析一下怎样创建并运行一个容器. 创建一个容 ...
 - Python忽略warning警告错误
		
python开发中经常遇到报错的情况,但是warning通常并不影响程序的运行,而且有时特别讨厌,下面我们来说下如何忽略warning错误. 在说忽略warning之前,我们先来说下如何主动产生war ...
 - ML_R Kmeans
		
Kmeans作为机器学习中入门级算法,涉及到计算距离算法的选择,聚类中心个数的选择.下面就简单介绍一下在R语言中是怎么解决这两个问题的. 参考Unsupervised Learning with R ...
 
随机推荐
- Splash Screen 加载窗体 [not finished]
			
对于windows开 发人员来说在打开VS开发工具时,总是先呈现一个SplashScreen界面,登上几秒钟后才打开VS的主界面.这样的效果一般是在主界面需要加载大量 资源,为避免主界面变成“死”界面 ...
 - 使用AdBlock plus屏蔽广告
			
使用前 使用后 定制规则 使用前 添加规则 id=1的为广告
 - java核心知识点----创建线程的第三种方式 Callable 和 Future CompletionService
			
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
 - C#的ComboBox学习使用2018.08.03
			
ComboBox是一个有下拉列表的文本显示框,其text为当前的文本,item属性为项 comboBox1.Items.Add("); id = comboBox1.Text; 可以采用se ...
 - java tomcat报错: Starting Tomcat v7.0 Server at localhost' has encountered a problem问题
			
运行web项目的时候出现下面错误: 出现这个问题的原因是 这个tomcat在其他项目中正在运行 关掉即可.
 - 【HDU4405】Aeroplane_chess
			
题意 飞行棋.有n+1格,开始时在0号格子,每一步都要扔一个dice(六个面,概率相同)哪一面朝上他就会向前走x+i步.当x+i大于等于N的时候,游戏结束.另外,地图上有m条航线.第i条航线可以直接从 ...
 - centos 6.5 部署openvpn 2.4
			
软件下载地址 软件下载地址 https://openvpn.net/index.php/open-source/downloads.html 服务端 源Tarball(gzip) https://sw ...
 - jquery简单ajax示例_读取json文件数据
			
来自于<jquery权威指南> -------------------------------------- 点击button后,获取到json文件数据,显示如下: Json文件: [ { ...
 - 使用python管理Cisco设备-乾颐堂
			
今天发现一个老外使用python写的管理cisco设备的小框架tratto,可以用来批量执行命令. 下载后主要有3个文件: Systems.py 定义了一些不同设备的操作系统及其常见命令. Conne ...
 - Python原始套接字编程-乾颐堂
			
在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_R ...