首页 > 编程语言 >C/C++ 建议编译选项

C/C++ 建议编译选项

时间:2024-07-24 13:17:54浏览次数:12  
标签:选项 变量 int 程序 C++ 编译 foo

本文介绍一些 OI 选手可能用到的编译选项。

警告选项

在程序设计中,我们可能不小心写出一些不合常理的代码语句。大部分情况下,这会使程序行为脱离我们的本意。使编译器发出警告可以在一定程度下规避这种情况。

-Wall

启动常见的警告选项,包括但不限于:

  • 未使用的变量、函数或标签
  • 未初始化的自动变量
  • 格式化字符串不匹配
  • 悬空的控制表达式(if-else 嵌套有歧义)
  • 可能的除零操作
  • 空的循环体
  • 浮点数比较

-Wextra

额外包括一些警告选项,包括但/不限于:

  • 空指针解引用
  • 废弃的函数调用
  • 隐式堕落(switch 忘记 break
  • 可能的未定义行为

没有列举本人认为 OI 中不常用的选项,如“枚举值与整数值的比较”。

-Wformat=2

比上述 -Wall 中包含项更高级别的格式化字符串检查。

-Wpedantic

警告不符合严格标准的代码(编译器可能提供了扩展语法)

例子

例如,编译器可能提供栈空间上的变长数组声明:

{
  int n;
  cin >> n;
  int arr[n];
  ...
}

这在标准中是不被允许的,但可能作为扩展语法。

-Wshadow

警告变量覆盖。

尽管这可能是 C++ 的实用语法之一,但是使用同名变量可能引发不必要的麻烦。

题外话

前几天知道了一个命名空间的古怪语法:

int foo;
int main() {
  int foo;
  cin >> foo >> ::foo;
}

在上述代码中,foo 指代 main 函数内声明的变量,::foo 指代全局作用域内的变量。

栈空间

在 Windows 中,程序栈空间不是无限的,这在调试程序时可能存在麻烦。

使用 -Wl,--stack=2147483647 可以使你的程序栈空间达到 \(2147483647\) 字节,约 \(2\text{GB}\)。

其中,-Wl 表示将命令传送到链接器,--stack 是链接器的选项,控制进程栈的大小。

如果是 Linux 系统,在终端使用 ulimit -s unlimited

溢出检查

-ftrapv 选项可以检测整数溢出并导致程序异常终止。

使用 g++ 命令编译时,程序会将操作数保存在寄存器中,调用一个名称类似 __addvsi3 的函数,具体命名与操作符和变量类型有关。经测试,intlong long__int128 都有不同的命名,说明应该都能正常检查。short 运算时没有类似行为,说明不会检查。

使用 clang++ 命令编译时,程序会正常进行运算,然后使用 seto 指令检查溢出标志。不过,由于 short 运算时会使用 l 后缀的指令,不能正常检查。

以上内容来自本地测试,可能与其他环境存在出入。

这同样提醒我们,不要使用 short 类型,除非程序卡空间达到了变态的程度。

不会检查无符号整数溢出,因为后者是良定义的。

标签:选项,变量,int,程序,C++,编译,foo
From: https://www.cnblogs.com/weily09/p/18320694

相关文章

  • solaris10 for sparc 编译安装expect 实现sftp 脚本交互
    0、先设置root的环境变量:exportPATH=/usr/sfw/bin:/usr/ccs/bin:$PATH1、安装tcl下载tcl8.6.13-src.tar.gz文件下载网站:gunziptcl8.6.13-src.tar.gztar-xvftcl8.6.13-src.tarcdtcl8.6.13/unixmkdirsolariscdsolaris/../configure--prefix=/data/expect_local--e......
  • C++ 打印菱形的程序(Program to print the Diamond Shape)
    给定一个数字n,编写一个程序来打印一个有2n行的菱形。例子:  //C++programtoprintdiamondshape//with2nrows #include<bits/stdc++.h>usingnamespacestd;//Printsdiamondpatternwith2nrows voidprintDiamond(intn) {   intspace=n......
  • 【简单易懂,复制可运行】C++通讯录管理系统实现增删改查
    自己写的300行c++通讯录管理系统,可以实现如下功能: 具体代码如下:#include<iostream>usingnamespacestd;#defineMax1000//不要分号//设计联系人结构体structPerson{ stringm_Name; intm_Sex; intm_Age; stringm_Phone; stringm_Addr; };//设计......
  • 【C++】string类(上)
    个人主页~string一、标准库中的string类1、什么是string类2、string类的常用接口讲解(1)string类的常见构造(2)string类的容量操作(3)string类对象的访问及遍历(4)string类对象的修改(5)string类非成员函数(6)其他(7)vs和g++下string结构说明vs下的string结构g++下string结构......
  • 有没有办法将下拉选项放置在选项选择菜单中?
    特别是对于我的具体情况,使用dcc.Dropdown效果非常好。唯一的问题是,在很多情况下,用户可能会选择多个选项,这在视觉上看起来非常难看。有没有办法让下拉菜单像这样?我已经想到了关于创建一个打开的菜单,其中包含可以选择作为清单的选项,但这会使代码更复杂,因......
  • c++_爆刷n题
    P1089[NOIP2004提高组]津津的储蓄计划题目描述津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%20%......
  • C++ 运算符重载的注意事项
    C++的运算符重载是一种强大的特性,它允许开发者为已存在的运算符赋予新的含义,以适应特定数据类型的需求。在使用运算符重载时,需要注意以下几点:不改变运算符原有语义:运算符重载应保持运算符原有的基本含义,避免引起混淆。例如,重载加法运算符+时,应确保其结果与常规加法操作相符。......
  • 记一次在openEuler系统下离线编译升级到openssh9.8p1
    缘起由于某个项目上甲方对服务器进行漏洞扫描,系统为:openEuler22.03(LTS-SP4)。提示现有OpenSSH版本存在漏洞,需要升级到openssh-9.8p1的版本(目前最新),遂有了这篇记录文章。PS:切记!在升级SSH之前服务器上最好安装telnet或其他远程工具,以防升级失败导致无法链接上服务器。1、检查......
  • Selenium 是否可以检测发送到 devtools 网络选项卡中站点的特定请求?
    我在Chrome和Firefox上使用python上的Selenium。我希望selenium等待,直到将特定请求发送到可以位于devtools的网络选项卡中的站点。例如名称为“index-24c3e2ca18.js”且请求URL为“https://www.wikipedia.org/portal/wikipedia.org/assets/js/index-24c3e2ca18.js”......
  • C++进阶 继承
    目录继承的概念及定义继承概念继承定义定义格式 继承关系和访问限定符 继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数构造函数 拷贝构造函数 赋值运算符重载析构函数总结继承与友元继承与静态成员浅谈复杂的菱......