算法竞赛中G++编译器的编译指令简单说明

算法竞赛使用的在线判题平台在FAQ会给出提交的代码是通过什么指令进行编译的。比如hustoj给出的c++编译指令通常是:

C++: g++ Main.cc -o Main -fno-asm -O2 -Wall -lm --static -DONLINE_JUDGE

这些看上去没有用的指令事实上的确有用。那么这些指令是什么意思呢?

  • -o Main:这个是指出输出文件名的参数,此处文件名为Main。针对算法竞赛这个似乎没必要知道。。
  • -fno-asm:这个的意思和字面(不让用汇编)差不都,也就是作用为不把asm,inline,typeof作为关键字。那么,不能用汇编,不能用内联,不能用typeof。这是一些限制,不是好事吧。。。
  • -O2:优化指令。后面可以跟数字表示优化级别。-O0表示不优化,-O1,-O2,-O3优化程度依次递增。OI竞赛是不开优化的,acm是O2。优化的例子,比如编译器开优化,int类型*2 /2会优化成>> / <<(位运算)。有说法是开优化有时候会把代码里面的疏漏显现出来(尤其是-O3)。那么在竞赛时这样做兴许会帮助找错吧。但是优化级开得太高对于调试不利。因为为了优化,编译器可能会打乱部分代码的顺序,造成我们单步调试时候会发现在C源代码里乱跳。
  • -Wall:这个的意思不是墙XD。W是警告,all是显示大多数警告。all的意思是所有但是实际是大多,这是因为一些警告是需要手动开启的。比如。。-Wfloat-equal这个指令会在浮点数直接使用==判断是否相等时给出警告,等等。
  • -lm:link math。使用数学库。这个没啥说的。。。
  • --static:静态链接编译指令。这个可以使得程序不再依赖外部的函数库运行。(于是我用的Qt编译的程序就不依赖各种Qtxxxx.dll了= =)。这个对于算法竞赛好像可以无视。。
  • -DONLINE_JUDGE:define ONLINE_JUDGE。也就是说写代码的时候可以写一些方便自己调试的代码,然后让其在提交后不被执行。比较常见的用法有在【#ifndef ONLINE_JUDGE】和【#endif】中间塞【freopen("output.txt", "w", stdout);】重定向输出流。等等。
  • -g:调试指令。在程序中塞入调试信息。这个在上面的那些参数中没有(废话...),这里提到的原因就是在使用Code::Block时,如果调试不能用,需要去加这个参数。

写这个的原因是之前这些编译指令是什么意思大多我都不太清楚,于是照着文档和实际应用写了个清单性质的总结。那么,以后应该也用得到了吧。比如,开O3看看能不能找出代码隐含的毛病(尚未试过),利用ONLINE_JUDGE(之前就已经有在使用了)。

这些内容,以后应该会在编译原理中学到吧。

时间: 2024-10-08 03:22:40

算法竞赛中G++编译器的编译指令简单说明的相关文章

[转]Delphi预编译指令总结

Delphi预编译指令总结 Delphi作为一个优秀的开发工具,这不仅是由于它开创了"构件 (Component)"时代,影响深远:另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的 编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点.Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必

Linux运行c++程序gcc编译器和g++编译器的区别

gcc编译器和g++编译器在编译时都要经过这三个步骤:1.预处理生成.i文件 2.预处理后转换为汇编生成.s文件 3.汇编转化为机器码生成可执行的.o文件 4.连接生成可执行文件 但是在gcc编译器中,是不能直接连接c++库的,所以在链接过程中会出错,只要在链接命令后面加上一个"-lstdc++"即可实现.. gcc和g++都可以编译c和c++代码,.c文件g++会把其当做c++文件,而.cpp文件,两者都会识别为c++文件,编译阶段g++会调用gcc.但是gcc不能和c++程序的库相

Delphi中预编译指令

本文转自 http://www.cnblogs.com/JackSun/archive/2010/12/20/1911250.html <Delphi下深入Windows核心编程>(附录A Delphi编译指令说明) Delphi快速高小的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有 时也需要对编译器进行必要的设置. ***********************************************

gcc/g++ 实战之编译过程

gcc和g++分别是GNU(一个开源组织)的c&c++编译器 对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序.gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译,但是g++无论是.c或.cpp都统一按c++程序来编译. 编译阶段,g++会调用gcc,链接阶段通常会用g++来完成,g++在编译的过程中,其实是调用gcc按照c++程序来编译的.即编译工作最终都是由gcc来完成的.这是因为gcc命令不能自动和

iOS中的预编译指令的初步探究

看到非常好的两篇技术文,转来方便自己查看. 转自:http://www.cnblogs.com/daiweilai/p/4234336.html 开篇 我们人类创造东西的时候有个词叫做”仿生学“!人类创造什么东西都会模仿自己来创造,所以上帝没有长成树的样子而和人长得一样,科幻片里面外星人也像人一样有眼睛有鼻子……但是人类自己创造的东西如果太像自己,自己又会吓尿(恐怖谷效应),人类真是奇葩:奇葩的我们在20世纪创造了改变世界的东西——计算机(电脑),不用怀疑,这货当然也是仿生学!这货哪里长得像人了

gcc/g++ 实战之编译的四个过程

gcc和g++分别是GNU(一个开源组织)的c&c++编译器 对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序.gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译,但是g++无论是.c或.cpp都统一按c++程序来编译. 编译阶段,g++会调用gcc,链接阶段通常会用g++来完成,g++在编译的过程中,其实是调用gcc按照c++程序来编译的.即编译工作最终都是由gcc来完成的.这是因为gcc命令不能自动和

windows Notepad++ 上配置 vs 编译器 , 编译并运行

windows 中 配置 vs编译器 在Linux下,Kris是倾向于在终端中使用gcc和g++来编译C/C++的,在Windows下相信很多人都是选择臃肿的Visual Studio,我亦不免如此.但是,我希望在Windows下也能像Linux下一样简洁编程,于是开始了我的Windows下的C/C++命令行编译环境打造之路. 几乎没有人会否认集成开发环境 (IDE)(例如,Visual Studio,NetBeans,Eclipse)所提供的能使编程工作变得相当简单的诸多功能.但,还是说说命令

在EJS脚本内使用“#include”预编译指令

此博客为9925.org的镜像,登录9925.org可以查看到最新博文. 原文出处:http://ily.so/26bMBz 预编译指令是Easton JavaScript脚本解释器对JavaScript语言拓展的重要功能之一,使用预编译指令可以引用外部的JS脚本代码,类似于HTML内的<script>标签引用外部JS脚本. #include语法解释 以“#include”指令开始,一行一个指令,指令后面加不加空格都无所谓,但是为了方便阅读通常情况下都加一个空格. 例如: //引用运行库内的A

Linux环境下GNU, GCC, G++编译器

一,GNU GNU是"GNU 's Not Unix"的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new相同) 为保证GNU软件可以自由地"使用.复制.修改和发布",所有GNU软件都在一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL).这个就是被称为"反版权&q