首页
学习
活动
专区
圈层
工具
发布

C++最佳实践 | 1. 工具

++则发出警告(所有版本的GCC, Clang >= 3.2) -Wconversion 对可能丢失数据的类型转换发出警告 -Wsign-conversion 对影响到符号的类型转换发出警告(Clang...if/else分支有重复条件,则发出警告(仅在GCC >= 6.0中) -Wduplicated-branches 如果if/else分支有重复的代码,则发出警告(仅在GCC >= 7.0中) -Wlogical-op...在可能需要按位操作的地方使用逻辑操作时发出警告(仅在GCC中) -Wnull-dereference 如果检测到空解引用将发出警告(仅在GCC >= 6.0中) -Wuseless-cast 如果执行强制转换到相同的类型...,则会发出警告(仅在GCC >= 4.8中) -Wdouble-promotion 如果float隐式提升为double则发出警告(GCC >= 4.6, Clang >= 3.8) -Wformat=...不幸的是,覆盖率分析需要禁用编译器优化,这将导致测试执行时间大大延长。

4.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用

    #pragma warning #pragma warning 用于控制编译器的警告信息,可以开启、关闭或修改警告等级。这在开发过程中非常有用,特别是当我们不希望编译器生成某些警告时。...3.1 基本语法 #pragma warning 用于控制编译器发出的警告信息,主要有以下几种形式: 语法形式 作用 说明 #pragma warning(push) 保存当前警告状态。...#pragma warning(disable: n) 禁用特定编号的警告(如 n)。 编译器不会对编号为 n 的警告发出提示。...在 func2 中,虽然使用了未初始化的局部变量,C4700 警告被禁用,不会触发警告。...#pragma optimize 性能敏感代码段前 在性能优化要求较高的代码段前使用;通常在模块初始化、算法实现等性能瓶颈处设置,避免全局优化的副作用影响整个程序调试。

    4.2K10

    这篇文章不知道起什么名字

    我这个文章不知道起什么名字,我就是在课堂上面搭建的了一个GCC的环境 help命令展示所有的帮助文件 打印所有平台的编译信息 gcc版本 对文件进行头文件展开 -E是展开头文件的编译开关 这个开关是生成汇编语言...-Werror:不区分警告和错误,遇到任何警告都停止编译 -Wall:开启大部分警告提示 -Wshadow:某语句块作用域变量与更大作用域的另一变量同名时发出警告(次警告未包含在-Wall选项中,需单独开启...) -Wextra:对所有合法但值得怀疑的表达式发出警告 -O0:关闭所有优化选项 -O1:第一级别优化,使用此选项可使可执行文件更小,运行更快,并不会增加太多编译时间,可以简写为-O -O2:第二级别优化...,采用了几乎所有优化技术,使用此选项会延长编译时间 -O3:第三级别优化,在-O2的基础上增加了产生inline函数、使用寄存器等优化技术 -O5:此选项类似于-O2,作用是优化所占用的空间,但不会进行性能优化...加入到搜索库文件的路径列表中 -Dname:预定义一个名为name的宏,值为1 -Dname=definition:预定义名为name,值为definition的宏 -M:告诉预处理器输出一个适合make

    97230

    CMake搭建编译环境总结

    -pedantic-errors参数将这些警告视为错误,等同于-Werror=pedantic。 -Wconversion: 在隐式转换可能导致值变化的时候发出警告。...-Wformat 检查标准库函数的使用格式是否正确,比如printf的格式化字符串中的格式符和对应的参数是否匹配 -Wunused-function 对已声明但是未定义的静态函数和未被使用的非内联静态函数发出警告...-Wswitch 当用switch用于枚举类型时,判断分支是否包含所有枚举值,否则发出警告 -Wunused-variable 对声明但未被使用的变量发出警告 -Wunused-but-set-variable...-Wextra 单单只有-Wall可能还不够严格,GCC还有-Wextra作为补充,包括另外一些没有被-Wall包含的警告类型,譬如: 选项 作用 -Wcast-function-type 当函数被强转为不兼容的函数指针时发出警告...当存在被设置但是未被使用的参数发出警告,需配合-Wall -Wsign-compare 当比较有符号和无符号值时发出警告 配置交叉编译环境常需要的修改 设置默认库和头文件搜索路径 编译默认会从/usr

    3.2K20

    常用的gcc的__attribute__

    浏览代码,查看许多“ __attribute__使用过的地方”。 我在想在什么情况下使用什么“ __attribute__”?恰当使用__attribute编码可以提高程序的效率。...该packed属性指定结构成员应具有尽可能小的对齐方式 __attribute __(unused):通知编译器您期望变量未使用,并告诉它如果不使用它不要发出警告 __attribute __(weak...不能使用此属性来减少函数的对齐方式,而只能增加它的对齐方式。 __attribute __(unused):附加到变量的此属性意味着该变量可能未被使用。GCC不会对此变量发出警告。...__attribute __(always_inline):通常,除非指定优化,否则函数不会内联。对于内联声明的函数,即使未指定优化级别,此属性也会内联函数。...__attribute __(deprecated):如果在源文件中的任何位置使用该变量,则该属性将产生警告。

    2.5K90

    C++23 Lambda 表达式上的属性:P2173R1 深度解析

    (二)属性的重要性属性(Attributes)是 C++ 中用于为代码元素(如函数、类、变量等)提供额外语义信息的机制。它们可以帮助编译器更好地理解代码意图,从而进行优化或发出警告。...这导致了一些问题。例如,如果 Lambda 表达式包装了一个 [[noreturn]] 的函数,编译器无法正确推断其行为,可能会导致警告或错误。...例如,[[nodiscard]] 属性会影响 Lambda 表达式的调用者,如果调用者忽略了返回值,编译器会发出警告。...如果调用者忽略了这些返回值,可能会导致程序逻辑错误。...如果返回值被忽略,编译器会发出警告,提示开发者注意。(二)标记已弃用的 Lambda 表达式[[deprecated]] 属性可以用于标记已被弃用的 Lambda 表达式。

    42900

    编译选项含义

    编译选项: 现在我们Makefile中的编译选项有: -g :可执行程序包含调试信息;(给gdb调试使用) -O2:该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外 还会采用几乎所有目标配置支持的优化算法.../details/6095507 -fno-tree-vectorize 关闭程序中的向量化的选项;如果增加在-O3会默认开启,但我们并没有使用-O3选项; 程序向量化选项的意义网上搜索相应的资料并不多...,但总结起来应该就是使用gcc支持将相应的数学公式直接转换成程序代码,提高算法速度。...gcc是默认没有-fshort-enums这个选项的; -Wundef 当一个没有定义的符号出现在 #if 中时,给出警告。...-fomit-frame-pointer 能够提高程序性能; 原理上最主要的区别是少了栈帧的切换和栈地址的保存;在gdb 执行disassemble命令时,由于没有保存相应栈调用地址,而导致无法追踪函数调用顺序的问题

    3.3K60

    Swoole 4.4 正式版已发布

    另外 PostgreSQL 目前用户量非常低, 并且缺少必要的单元测试, 无法保证质量 Runtime::enableCoroutine 不再会自动兼容协程内外环境, 一旦开启, 则一切阻塞操作必须在协程内调用...特性时, statement 发出的的请求, 需要使用 statement->recv 接收 启动 defer/fetch_mode 特性时, 如有未接收完的数据, 将无法发起新的请求 与异步不同,...将废弃 Lock 模块,废弃原因:在协程模式下加锁可能存在问题,可使用 chan 实现协程版本的锁 由于引入了 stream_socket_pair 协程化, 建议开启hook时, 如有单独配置需求,...@twose) 浮点数计算误差优化 (#2572) (@tangl163) 所有内置类都 禁止克隆/禁止序列化/禁止删除底层定义的属性 (f9c974b8) (@twose) Server->bind...(@matyhtf) 修复Http2的trailer方法不输出值为空的头 (#2578) (@twose) 修复 Co\Http\Client->setCookies 在特殊情况下的内存错误 (#2644

    1.2K20

    【C语言高级特性】预处理指令(二)

    一旦 #undef 被执行,相应的宏定义就在整个翻译单元(Translation Unit,即从源代码文件到最终生成的目标代码文件所经历的编译过程的一个独立单元,通常指一个 .c 或 .cpp 文件)中被取消了...这些指令通常用于控制编译器的行为,比如优化代码、控制警告和错误的生成、指定代码的对齐方式等。...} MyStruct; #pragma pack(pop) // 恢复之前的对齐状态 ③示例 3:指定编译器特定的行为(以GCC为例) GCC 编译器支持一些 #pragma 指令,但与其他编译器相比...以下是一个假设性的 GCC 特定 #pragma 指令示例(注意:这不是GCC实际支持的指令,仅用于说明目的): #pragma GCC optimize("O2") // 假设性指令,用于临时更改优化级别为...O2 // 需要优化等级为O2的代码 // 注意:GCC实际上不支持这样的#pragma来更改优化级别,这只是一个示例 4.2.

    13210

    细谈linux gcc的入门相关知识和用法(超详细)

    ---- 第一:linux gcc包含的c/c++编译器  gcc  、cc  、c++  、g++ 其中gcc和cc是一样的,c++和g++是一样的,一般c语言程序就用gcc编译,c++程序就用...gcc有多种语言前端,用于解析不同的语言另外gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。gcc是自由软件。任何人都可以使用或更改这个软件。...] 优化程序(默认为2级优化,0不优化,3优化级别最高) -static 对生成的文件采用静态链接 -shared 尽量使用动态库 -Idir 将dir目录加入搜索头文件的目录路径 -Ldir 将dir...目录加入搜索库的目录路径 -llib 连接lib库 -Wall 使gcc对源文件的代码有问题的地方发出警告信息 -W 不发出警告信息 -g 在目标文件中生成调试信息,以便gdb之类的调试程序调试 -ggdb...但在gcc中,后缀是非常重要的,用来区分文件的类别。

    74760

    【Linux探索学习】第八弹——Linux工具篇(三):Linux 中的编译器 GCC 的编译原理和使用详解

    预处理器主要完成以下任务: 宏替换:将定义的宏(如 #define)替换为实际的值。 文件包含:处理 #include 指令,将被包含的文件内容插入到源文件中。...编译器会将每个源文件解析成相应的汇编指令。此过程包括以下几个步骤: 词法分析:将源代码分解成 tokens(词法单元)。 语法分析:根据语言的语法规则检查语句的正确性。...以下是一些常用的选项: -o : 指定输出文件名。 -Wall: 开启所有警告信息。 -g: 生成调试信息,用于调试程序。...-O: 优化级别,-O0(无优化)、-O1(基本优化)、-O2(较高优化)、-O3(最高优化)。 -c: 仅编译源代码,不进行链接,生成目标文件(.o)。...例子 生成调试信息: gcc -g hello.c -o hello 开启所有警告信息: gcc -Wall hello.c -o hello 进行优化编译: gcc -O2 hello.c -o hello

    81310

    CC++生态工具链——gccg++编译器使用指南

    #define macro" -Umacro #相当于C语言中的"#undef macro" -undef #取消对任何非标准宏的定义 警告与报错参数 -Wall #发出gcc提供的所有有用的报警信息...-Werror #将警告升级为编译报错 -Wextra / -W #启用-Wall未启用的额外警告位,对合法但值得怀疑的代码发出警告 例如 -Wsign-compare -pendantic.../ -Wpendantic #发出ISO C和ISO C++标准列出的所有警告,用于语法检查,-pedantic-erros的用法也类似 -fsyntax-only #仅做语法检查 调试参数 -g...-ggdb #生成gdb专用的调试信息 -glevel #请求生成调试信息,同时用level指出需要多少信息,默认的level值是2 编码配置参数 -fno-exceptions #屏蔽掉C++的异常...-O1 / -O #尝试优化编译时间和可执行文件大小 -O2 #尝试所有的优化选项,但不会进行“空间换时间”的优化方式 -Os #尝试所有的优化选项时,优先优化可执行文件大小 七,参考阅读 https

    3.6K31

    【错误记录】Android 应用漏洞修复处理 ( 无堆栈保护的 ELF 构建 SO 文件 | libarmeabi-v7alibijkffmpeg.so 安全检测出现问题 )

    ) ; 堆栈保护 指的是 栈溢出保护 , Canary 值 ; 执行 readelf -sW example.so 命令 , 可以查询动态库是否启用了 堆栈保护 ; 二、gcc 编译选项 -fstack-protector...的工作原理是在编译代码时插入一些保护代码 , 检测是否有堆栈溢出的发生 : Canary 值 : 在函数的 栈帧 中插入一个特殊的 Canary 值 , 该值 放置在 函数的局部变量 和 控制数据 之间...配置 在 Android.mk 脚本中配置 LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all 参数 , -Wall : 开启所有警告...; -O2 : 使用优化级别 2 , 进行代码优化 ; -U_FORTIFY_SOURCE : 取消 _FORTIFY_SOURCE 的定义 , 这是用于增强安全性的宏定义 ; -fstack-protector-all...中配置如下编译选项 : set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all") -Wall : 开启警告

    81810

    现代CPU性能分析与优化-性能分析方法-编译器优化报告​

    大多数编译器,包括 GCC、Clang 和 Intel 编译器(但不包括 MSVC),都提供优化报告,用于检查特定代码段执行了哪些优化。...由 c[i-1] 加载的值取决于前一次迭代的存储(参见图 @fig:VectorDep 中的操作 \circled{2} 和 \circled{3})。...如果我们将 @lst:optReport 中的代码向量化,它会导致在数组 a 中写入错误的值。...所有这些工具都帮助可视化基于 LLVM 的编译器成功的和失败的代码转换。 在 LTO5 模式下,一些优化是在链接阶段进行的。为了同时从编译和链接阶段发出编译器报告,应该向编译器和链接器传递专用选项。...Intel® ISPC3 编译器 (已在 [@sec:ISPC] 中讨论) 采用稍微不同的方式报告缺失的优化。它会针对编译为相对低效代码的代码结构发出警告。

    51010

    GCC -O2 踩坑指南:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)

    类型双关经常应用在编译器、序列化、网络传输等领域。 类型双关一般做法是通过别名(alias)来实现,通过获取对象的地址,将其转换为我们想要重新解释的类型的指针,然后访问该值。...4、违反严格别名规则 下面我们举几个例子,在 GCC 开启 -O2 优化时,违反严格别名规则导致的未定义行为。...4.1.3 开启 -fno-strict-aliasing 编译参数 开启 -fno-strict-aliasing 取消严格别名优化,修改 GCC -O2 导致的严格别名 Bug。...在开启 GCC -O2 编译优化时,对于有符号整数的溢出,编译器认为其是未定义行为。...开启 -O2 编译优化时,默认开启 -fstrict-overflow 编译优化,有符号整数的溢出行为为未定义行为,在 i 到达值 INT_MAX 后,评估 i++ 经常生未定义的行为,编译器会产生死循环

    2.6K10

    gccg++ 命令

    gcc -E sourcefile.c : -E,只执行到预编译,直接输出预编译结果 gcc -S sourcefile.c : -S,只执行到源代码到汇编代码的转换,输出汇编代码 gcc -c sourcefile.c...的目标文件 无标签的时候,生成名为 a.out 的可执行文件 gcc -g sourcefile.c : -g 生成供调用的可执行文件,可以在 gdb 中运行。...strip a.out gcc -s sourcefile.c : -s 直接生成与运用 strip 同样的效果的可执行文件 gcc -O sourcefile.c : -O 编译器对代码进行自动化编译...,输出效率更高的可执行文件 -O2 可以跟上数字表示优化等级 gcc -O2 sourcefile.c 数字越大越加优化。...但是也会有出 bug 的风险 gcc -Wall sourcefile.c : -W 在编译中开启一些额外的警告信息。-Wall,将所有的警告信息全开。

    59320
    领券