喜欢游戏的gcc设计者

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"的次序搞反了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。