gcc编译选项说明(2)

事情是这样的:

老哥无聊的又给翻译了一下针对c++的options,果然有mmt风格,哈哈,还挺详细,重点和常用的也都加粗了。

【C++ Language Options】

See Options Controlling C++ Dialect.

  -fabi-version=n :指定在代码中使用的二进制应用二进制接口(ABI)的版本。使用场景:在处理不同的操作系统或编译器之间的二进制接口时,可能需要指定不同的ABI版本。

  -fno-access-control :该选项禁用访问控制检查,允许访问私有成员和受保护成员。 -faligned-new=n :该选项指定 new 操作符分配内存的对齐方式。n的值应该是一个非负的整数,表示以字节为单位的对齐方式。

  -fargs-in-order=n :该选项指定是否按照参数的声明顺序进行函数调用。n的值可以是0或1。默认值为1。

  -fchar8_t :该选项启用char8_t类型,该类型用于表示UTF-8字符串。它是C++20标准中新增的类型。

  -fcheck-new : 该选项指示编译器生成代码来检查new操作符是否分配了足够的内存。如果分配失败,程序会调用std::bad_alloc异常。默认情况下,该选项是开启的。 -fconstexpr-depth=n :该选项指定在编译时计算constexpr函数的深度。如果递归深度超过n,则编译器会发出错误消息。默认值为512。

  -fconstexpr-cache-depth=n : 该选项指定在编译时计算constexpr函数时使用的缓存深度。如果缓存深度超过n,则编译器会忽略缓存。默认值为1024。 -fconstexpr-loop-limit=n :设置编译器在 constexpr 表达式中循环迭代的次数。使用场景:可用于限制编译器消耗的计算资源。

  -fconstexpr-ops-limit=n : 设置编译器计算 constexpr 表达式中使用的操作次数限制。使用场景:可用于限制编译器消耗的计算资源。 -fno-elide-constructors :禁用构造函数的省略。使用场景:在调试代码时,可用于检测构造函数的调用情况。 -fno-enforce-eh-specs :该选项禁用编译器强制执行EH规范的特性。EH表示异常处理。 -fno-gnu-keywords :该选项禁用GNU扩展的关键字。例如,使用该选项将禁用__attribute__和__extension__关键字。 -fno-implicit-templates :该选项禁用编译器的隐式模板实例化。默认情况下,编译器会在需要时自动实例化模板。 -fno-implicit-inline-templates :该选项禁用编译器的隐式模板内联。默认情况下,编译器会在需要时自动将模板函数内联。

-fno-implement-inlines :该选项指示编译器不应该将任何内联函数放置在目标文件中, 即使这些函数没有被调用也是如此。

  -fmodule-header[=kind] :用于模块的头文件生成。

  kind 可以是以下几种值之一:

  • umbrella:用于主模块头文件(如果存在)。

  • interface:用于头文件和文档的接口描述。

  • unit:用于单元实现的私有部分。

-fmodule-only :指示编译器只编译模块,而不编译任何程序。如果没有指定输出文件,则编译器将生成一个预编译的头文件,其中包含模块的代码。 编译选项告诉编译器仅编译指定的模块文件,而不生成目标文件或库文件。 这在使用 C++20 Modules 时非常有用,因为在这种情况下,每个模块都可以单独编译为一个文件, 而不是将整个程序编译为一个大文件,以提高编译速度和降低内存占用。 使用 -fmodule-only 选项时,编译器将仅处理模块接口声明部分,但不会生成对象代码或链接库文件。 这允许开发人员使用单独的编译命令来构建单个模块,而不必处理其他依赖关系。

  -fmodules-ts :启用 C++20 模块支持。 -fmodule-implicit-inline : 允许自动内联模块中的内联函数。

  编译选项是用来指示编译器在内联函数和变量的定义处进行隐式的内联。当这个选项被开启时,编译器会在定义时隐式地将这些内联定义添加到模块中,而不需要在使用它们的地方重新解析它们的定义。

  这个选项通常用于编译大型代码库中的模块,以提高编译速度和减小模块大小。但是需要注意的是,这个选项可能会导致模块之间的依赖关系更加复杂,因为在使用内联函数或变量时,需要确保在之前定义它们的模块已经被编译并链接到目标文件中。

  -fno-module-lazy :禁止将模块作为整个程序的最后一步加载。这可能会改善大型程序的响应时间,但会增加启动时间。 -fmodule-mapper=specification :为了避免重复编译,可以使用 -fmodule-mapper=specification 选项指定一个模块映射规范文件,将模块的名称映射到它们的文件。规范文件的格式与 Clang 生成的文件格式相同。

   -fmodule-version-ignore :忽略模块的版本。 -fms-extensions : 启用 Microsoft 扩展。

  -fnew-inheriting-ctors :C++17 标准中定义的新类型转换语法。

  -fnew-ttp-matching : 用于在类型别名、模板别名和 typedef 的名称空间中匹配新的类型名。

  -fno-nonansi-builtins :禁止使用非 ANSI 标准的内建函数。选项用于禁用GCC扩展的C内置函数,以使其行为与C标准兼容。这意味着只有标准C库提供的函数才能使用,例如printf()malloc()等。如果使用此选项,则无法使用一些GNU扩展函数,如__builtin_alloca()__builtin_expect()等。使用此选项可以提高代码的可移植性,但也可能导致某些性能损失,因为标准库函数可能不如GNU扩展函数效率高。

  -fnothrow-opt :对于某些函数调用,在没有抛出异常的情况下优化代码。

-fno-operator-names :禁止将 operator 函数映射到其名称,而是只使用运算符。 用于控制是否允许使用 C++ 中的运算符别名。默认情况下,编译器会为运算符定义别名,例如使用 and 代替 && ,使用 bitand 代替 & ,使用 compl 代替 ~ 等等。 在某些情况下,为了避免代码中的歧义和混淆,可能需要禁用运算符别名,此时可以使用 -fno-operator-names 选项。 使用场景: 当代码库中的一些代码依赖于运算符别名时,为了避免修改代码库的代码,可以使用 -fno-operator-names 选项来避免编译器产生运算符别名,从而保证代码的兼容性。 当代码中使用了自定义的运算符,且该运算符的名称与编译器默认的运算符别名相同时,为了避免冲突,也可以使用 -fno-operator-names 选项禁用运算符别名。

  -fno-optional-diags :禁止任何强制执行诊断,除了那些严重错误和警告。

  -fpermissive :允许非法代码编译,尽可能的编译代码。

  -fno-pretty-templates :禁用模板展开过程中的缩进格式化,使用场景为需要减少编译器输出噪音的情况,例如在模板嵌套层数较深时。默认情况下该选项是关闭的。

-fno-rtti :禁用运行时类型信息,使用场景为需要减小代码体积和运行时开销的情况, 例如在嵌入式系统中。默认情况下该选项是关闭的。

  -fsized-deallocation :启用有大小的内存释放操作,使用场景为需要检测释放内存的大小和避免内存泄漏的情况。默认情况下该选项是关闭的。

-ftemplate-backtrace-limit=n :限制模板实例化时的回溯层数, 使用场景为需要减少编译时间或内存占用的情况。默认情况下该选项的默认值为100。

  -ftemplate-depth=n : 限制模板实例化的嵌套深度,使用场景为需要减少编译时间或内存占用的情况。默认情况下该选项的默认值为1024。 -fno-threadsafe-statics : 禁用线程安全的静态变量初始化,使用场景为需要减少编译时间或代码大小的情况。默认情况下该选项是关闭的。

  -fuse-cxa-atexit : 使用C++ ABI规范中的atexit()函数,使用场景为需要在C++程序中注册退出处理函数的情况。默认情况下该选项是开启的。 -fno-weak : 禁用弱符号链接,使用场景为需要强制要求符号链接的唯一性的情况。默认情况下该选项是关闭的。

  -nostdinc++ : 不使用标准C++库,使用场景为需要自行实现C++库的情况。默认情况下该选项是关闭的。 -fvisibility-inlines-hidden : 将内联函数的可见性设为隐藏,使用场景为需要减少库的符号表大小的情况。默认情况下该选项是开启的。 -fvisibility-ms-compat : 与Microsoft Visual C++兼容的可见性规则,使用场景为需要与Visual C++进行互操作的情况。默认情况下该选项是关闭的。 -fext-numeric-literals : 支持C++14引入的二进制、八进制和十六进制数字字面值扩展,使用场景为需要使用这些扩展的情况。默认情况下该选项是关闭的。 -flang-info-include-translate[=header] : 为了调试Fortran代码使用。当编译Fortran代码时,将源文件路径映射到另一个位置,可通过此选项指定头文件包含文件的路径。 -flang-info-include-translate-not : 为了调试Fortran代码使用。指示编译器不应将源文件路径映射到另一个位置,可用于检查程序中哪些源文件不是使用映射过的文件。 -flang-info-module-cmi[=module] : 为了调试Fortran代码使用。指定生成一个Fortran模块的编译器中间表示(CMI)文件,该文件包含了有关模块的信息,如符号和类型等。此选项允许生成此类文件并指定文件名和路径。

-stdlib=libstdc++ (libc++) : 指定使用的C++标准库类型。可用于选择使用GNU或Clang的C++标准库。 它接受一个参数,该参数是libstdc++或libc++中的一个。默认情况下,如果未指定此选项,则使用libstdc++作为默认标准库。 使用-stdlib选项可以更改使用的C++标准库,从而影响代码的链接和运行时行为。 例如,如果需要在Mac OS X上使用libc++作为标准库,可以在编译时使用-stdlib=libc++选项。

   -Wabi-tag : 当C++ ABI标签不匹配时,生成警告信息。可用于检查ABI兼容性。

  -Wcatch-value :检测异常处理程序中的值是否为基础类型,从而发现潜在的错误。

-Wcatch-value=n : 指定异常处理程序中值的最大大小(以字节为单位),从而帮助检测可能的栈溢出。
-Wno-class-conversion :禁用由派生类到基类的隐式转换警告。 -Wclass-memaccess : 检测在进行成员访问时是否使用了无效的指针或引用。 -Wcomma-subscript : 检测逗号表达式是否用作数组下标,因为这可能会导致错误的行为。 -Wconditionally-supported : 检测使用条件支持的特性,以及对这些特性的使用是否正确。 -Wno-conversion-null : 禁用指针类型到布尔类型的隐式转换警告。 -Wctad-maybe-unsupported : 检测是否使用了不支持的类模板自动推导(CTAD)功能。 -Wctor-dtor-privacy : 检测C++类构造函数和析构函数的可见性是否正确。这个选项的默认值是开启的。 -Wdangling-reference : 检测悬空引用,即引用指向已经被释放的内存。 -Wno-delete-incomplete : 禁用从不完整类型中删除时的警告。 -Wdelete-non-virtual-dtor : 检测非虚拟析构函数的删除,这可能导致内存泄漏和未定义的行为。 -Wno-deprecated-array-compare : 禁用使用“<”和“>”比较数组警告。 -Wdeprecated-copy : 检测使用已弃用的复制构造函数的警告。 -Wdeprecated-copy-dtor : 该选项用于检测使用已弃用的拷贝构造函数和析构函数的代码, 并发出警告。如果用户重载了拷贝构造函数或析构函数,而没有使用新语言关键字,该选项就会发出警告。

   -Wno-deprecated-enum-enum-conversion :该选项用于禁止警告 C++17 枚举之间的隐式转换(从 int 到枚举类型),这在 C++20 中是不推荐的,因为它可能会导致意外的错误。

  -Wno-deprecated-enum-float-conversion :该选项用于禁止警告 C++17 枚举和浮点数之间的隐式转换,这在 C++20 中是不推荐的,因为它可能会导致意外的错误。 -Weffc++ :该选项用于检测代码是否符合《Effective C++》一书中提到的 C++ 编程惯例。如果违反这些惯例,该选项将发出警告。

  -Wno-exceptions :该选项用于禁用异常检查,即禁用编译器在编译时检查是否有异常被抛出或未被捕获。这可以提高代码的执行效率,但也会使代码更难以调试。

  -Wextra-semi :该选项用于检测代码中多余的分号,并发出警告。

  -Wno-inaccessible-base :该选项用于禁止检查基类是否无法访问,即在派生类中是否无法访问基类的某些成员函数或成员变量。这可以避免编译器在对不可访问的基类成员进行访问时发出警告。

  -Wno-inherited-variadic-ctor : 该选项用于禁止警告从基类继承的变长参数构造函数(即使用可变参数的构造函数)的存在。

  -Wno-init-list-lifetime : 该选项用于禁止警告关于使用初始化列表的生命周期的问题。 -Winvalid-constexpr :该选项用于检测 constexpr 函数中是否存在不合法的表达式,即无法在编译时求值的表达式,并发出警告。

  -Winvalid-imported-macros : 该选项用于检测导入的宏是否存在语法错误,并发出警告。 -Wno-invalid-offsetof :该选项用于禁止检查使用 offsetof 宏时是否存在问题。如果开启该选项,则编译器将不会对使用 offsetof 宏的代码进行警告。-Wno-literal-suffix :该选项用于禁止警告自定义字面值后缀的使用。 -Wmismatched-new-delete :检查 new 和 delete 的使用是否匹配。默认情况下该选项是启用的。-Wmismatched-new-delete is included in -Wall.

  -Wmismatched-tags :该选项用于检测类型声明中的不匹配的标记。默认情况下该选项是启用的。 -Wmultiple-inheritance :该选项用于检测多重继承中的问题。默认情况下该选项是启用的。

  -Wnamespaces :该选项用于检测命名空间中的问题。默认情况下该选项是启用的。

  -Wnarrowing :该选项用于检测收缩转换问题。默认情况下该选项是启用的。 -Wnoexcept :该选项用于检测noexcept关键字的问题。默认情况下该选项是启用的。

  -Wnoexcept-type :该选项用于检测noexcept表达式的问题。默认情况下该选项是启用的。

  -Wnon-virtual-dtor :该选项用于检测基类的析构函数是否为虚函数。默认情况下该选项是启用的。

-Wpessimizing-move  :该选项用于检测在移动构造函数和移动赋值函数中,值参数的最优化问题。默认情况下该选项是禁用的。

  -Wno-placement-new :该选项用于禁用在非全局作用域下的placement new表达式的警告。默认情况下该选项是禁用的。

  -Wplacement-new=n :该选项用于控制在非全局作用域下的placement new表达式的警告级别。默认情况下n为2。 -Wrange-loop-construct :该选项用于检测范围for语句的问题。默认情况下该选项是启用的。

  -Wredundant-move :该选项用于检测冗余的移动操作。默认情况下该选项是禁用的。

  -Wredundant-tags :该选项用于检测无用的标记。默认情况下该选项是启用的。 -Wreorder :该选项用于检测对象成员初始化列表的顺序问题。默认情况下该选项是启用的。

  -Wregister :该选项用于检测使用register关键字的问题。默认情况下该选项是启用的。 -Wstrict-null-sentinel :该选项用于检测传递给函数的空指针常量的问题。默认情况下该选项是启用的。

  -Wno-subobject-linkage :该选项用于禁用子对象链接警告。默认情况下该选项是禁用的。

  -Wtemplates :该选项用于检测模板代码的问题。默认情况下该选项是启用的。 -Wno-non-template-friend :该选项用于禁用未在模板之内的友元函数警告。默认情况下该选项是禁用的。

  -Wold-style-cast :检测使用C风格的类型转换语法,例如(type)expression。使用场景包括在C++代码中避免使用C语言的类型转换语法,以提高代码可读性和可维护性。默认情况下开启此选项。 -Woverloaded-virtual :检测派生类中覆盖了基类虚函数,但函数签名与基类虚函数不完全匹配的情况。使用场景包括在继承和多态机制中避免错误,以提高代码质量和可维护性。默认情况下开启此选项。

  -Wno-pmf-conversions :禁止从指向成员函数的指针转换为其他类型的指针。使用场景包括避免在不同的对象之间共享成员函数指针,以提高代码安全性和可维护性。默认情况下关闭此选项。

-Wself-move :检测在对象上执行自我移动的情况,即将对象作为std::move的参数传递给自己。使用场景包括避免在移动语义中出现错误,以提高代码健壮性和可维护性。默认情况下关闭此选项。

  -Wsign-promo : 检测在带符号和无符号类型之间进行算术运算或位运算时隐式转换的情况。使用场景包括避免数据类型的错误转换,以提高代码健壮性和可维护性。默认情况下关闭此选项。 -Wsized-deallocation : 检测使用了带有大小参数的delete操作符来删除动态分配的内存。使用场景包括在代码中避免使用不安全的内存释放方式,以提高代码健壮性和可维护性。默认情况下关闭此选项。

  -Wsuggest-final-methods : 检测不应该被派生类重写的虚函数是否被声明为虚函数。使用场景包括在继承关系中避免不必要的重写,以提高代码健壮性和可维护性。默认情况下关闭此选项。 -Wsuggest-final-types : 检测可能不应该被继承的类是否声明为虚基类。使用场景包括在继承关系中避免不必要的继承,以提高代码健壮性和可维护性。默认情况下关闭此选项。

  -Wsuggest-override : 对于虚函数,如果派生类中没有覆盖基类的虚函数,则发出警告。使用场景是帮助程序员在继承时避免错误,并提高代码可读性。默认情况下,此选项未启用。 -Wno-terminate :发出警告,如果代码包含调用std :: terminate的行为,例如未捕获的异常。使用场景是帮助程序员避免程序意外终止。默认情况下,此选项未启用。

  -Wuseless-cast :发出警告,如果存在不必要的类型转换,例如将int转换为int。使用场景是帮助程序员在代码中消除无用的类型转换。默认情况下,此选项未启用。

-Wno-vexing-parse :发出警告,如果出现可疑的代码,可能会导致C++语言中的“最令人困惑”的语法问题之一,即将名称解析为函数声明而不是变量声明。 使用场景是帮助程序员避免语法错误。默认情况下,此选项未启用。

  -Wvirtual-inheritance :对于在继承体系中使用虚继承的类发出警告。使用场景是帮助程序员避免在继承中出现复杂的情况。默认情况下,此选项未启用。 -Wno-virtual-move-assign :发出警告,如果类具有虚拟基类且移动赋值操作符未定义,则发出警告。使用场景是帮助程序员确保代码中的赋值操作符正确地处理虚拟基类。默认情况下,此选项未启用。

  -Wvolatile :发出警告,如果未使用volatile关键字就访问了volatile类型的对象。使用场景是帮助程序员识别可能的错误。默认情况下,此选项未启用。

  -Wzero-as-null-pointer-constant : 发出警告,如果将整数0用作空指针常量。使用场景是帮助程序员避免代码中的潜在问题。默认情况下,此选项未启用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值