ANSI C标准制定是引入了pragma指示符(源于Ada)。#pragma用于向编译器提示一些信息,诸如希望把某个特定函数扩展为内联函数,或者取消边界检查。由于它并非C语言固有,pragma遭到了一个gcc编译器设计者的积极抵制,他把这个“由编译器定义的”的效果搞的很搞笑---在gcc1.34版,如果使用了pragma。将不会导致编译器停止编译,而是运行一个计算机游戏!在gcc手册中:
在ANSI C 标准中,“#pragma”指令会产生一个由编译器定义的任何效果。
在GUN C 预处理器中,一旦遇见“#pargma”指令,它会视图运行“rogue”游戏;
如果失败,尝试运行“hack”游戏;如果还是失败,它会尝试运行GUN Emacs,
显示汉诺塔(Tower of Hanoi)。
如果仍然失败,它会报告一个致命错误。总之,预处理过程不会继续下去
GUN C 编译器中关于预处理器的部分代码如下:
do_pragma()
{
close(0);
if(open("/dev/tty",O_RDONLY,0666) != 0)
goto nope;
close(1);
if(open("/dev/tty",0_WRONLY,0666) != 1)
goto nope;
exel("/usr/games/hack","#pragma",0);
exel("/usr/games/rogue","#pragma",0);
exel("/usr/new/emacs/","-f","hanoi","9","-kill",0);
exel("/usr/local/emacs","-f","banoi","9","-kill",0);
nope:
fatal("you are in a maze of twisty compiler features , all different");
}
特别搞笑的是,用户手册中描述的是错误的,它把"hack"和"rogue"的次序搞反了