当指定 -g 时,gcc 会定义什么吗?

2024-04-03

很快,我想知道 gcc (或 g++。我需要它C,但也对 c++ 感到好奇)定义了任何特殊符号,如果-g已启用。可以?如果是的话,是什么符号?

在搜索过程中我发现:

  • _DEBUG是手动定义的(手动我的意思是-D_DEBUG)并且是 Visual C 程序员的一个习惯(因为 VC 定义了_DEBUG在调试模式下编译时)
  • NDEBUG如果不在调试模式下则定义。虽然我发现有几个地方这么说,但我尝试在 .c 和 .cpp 文件中使用 gcc 和 g++,但没有一个有或没有-g没有定义这样的符号!

Edit:让我演示一下为什么我不想使用非标准符号:

想象一个内核模块,它执行某些操作,并且还提供要包含在其他内核模块中的头文件,以便它们可以连接到该模块。

现在作为一种工具,在我的一个头文件中:

#ifdef DEBUG <-- This is what I need
#define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__);
#else
#define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__);
#endif

请注意,该名称并不是真正的名称LOG,这就是一个例子。

现在,我可以使用任何符号DEBUG我自己,但是如果有人包含我的标题,他们可能不会定义该符号。当然,我可以告诉他们“顺便说一句,要在调试模式下获取标头,请定义另一个符号”,但这对我来说听起来不太正确。

我可以在标头中定义符号并将其包含在所有标头文件中。这样,如果它们包含我的标头之一,它们也会获得调试符号。现在的问题是,如果他们don't想在调试模式下编译,我的标头仍然认为它们处于调试模式。

所以我认为最好是使用一个在以下情况定义的符号-g被使用过,如果有的话!

Update

到目前为止,我得出的结论是我可以做这样的事情:

如何构建.h

#if !defined(NDEBUG)
#define MY_DEBUG
#endif

Usage:

#include "how_to_build.h"

#ifdef MY_DEBUG
// rest of the story

这样,常见的选择是NDEBUG也删除了我的定义。如果他们不想在调试模式下获取标头,它仍然需要我告诉他们定义它。


您可以看到 gcc/g++ 为任意标志组合定义的所有宏的列表,如下所示:

$ g++ -E -dD -xc++ /dev/null

例如:

[max@truth ~]$ g++ -E -dD -xc++ /dev/null > a
[max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b
[max@truth ~]$ diff a b
1a2
> # 1 "/home/max//"
173c174
< #define __NO_INLINE__ 1
---
> #define __OPTIMIZE__ 1

让我们看看是否-g定义任何东西:

[max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c
[max@truth ~]$ diff a c
1a2
> # 1 "/home/max//"

额外的预处理器指令,但没有额外的宏-g flag.


这是有道理的:-g对代码生成没有影响,仅对对象文件元数据有影响(调试symbols).

-O0是“调试mode“代码生成用于一致的调试,而不是-Og或更高。 (这个答案 https://stackoverflow.com/questions/53366394/why-does-clang-produce-inefficient-asm-with-o0-for-this-simple-floating-point更详细地解释了这对于 gcc 和 clang 等编译器意味着什么:在每个语句之后将所有变量存储回其内存位置,并且不要跨语句进行优化。)

-O3 and -g是正交的(除了在调试优化代码时某些变量得到“优化”,并且执行似乎在源代码行之间跳转。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当指定 -g 时,gcc 会定义什么吗? 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • 从 C 中的函数分配结构

    我在编写一个在 C 中分配结构的函数时遇到问题 理想情况下 我希望该函数使用传递给它的参数来填充结构的字段 我在头文件中定义了结构 如下所示 typedef struct char name NAME SIZE Employee name
  • 如何使 git diff --ignore-space-change 成为默认值

    我可能可以设置一个别名 但似乎我应该能够将其设置为配置文件中的一个选项 只是我无论如何都看不到这样做 我只想要 ignore space change当我做 diff 时 而不是当我做 apply 或其他任何事情时 我试图让差异更容易理解
  • cordova-ionic ngCordova ios 或 iPhone 文件读取错误代码 5 ENCODING_ERR

    我正在使用 cordova ionic 框架来构建应用程序 我是 iOS 或 iPhone 新手 根据我的要求 我必须读取应用程序中的文件 我正在 Android 应用程序中读取文件 但相同的代码显示错误 代码 5 我正在跟踪代码类型 在安
  • 使用复选框过滤 FullCalendar 事件(使用 JavaScript 的客户端)

    我有一个运行良好的 fullcalendar 脚本 它根据数据属性通过以下方式将 css 类添加到事件中eventRender 我现在需要使用复选框过滤这些特定属性 但我根本不知道应该如何实现这一点 我的脚本如下所示
  • 用于跟踪图像 url 的 HTTP 302、303 或 307

    我正在尝试跟踪我们发送的特定电子邮件是否被打开 因此在我发送的每封电子邮件上使用图像的哈希 URL 目前 当请求该 url 时 我会记录电子邮件已被查看的事实 基于 url 中的哈希值 并从 Web 应用程序服务器提供图像 对于每个人来说都
  • 为什么 yacc 无法解析语法规则的第二行,即使它正确解析了第一行?

    我想将行解析为 20191201 170003296 1 102290 1 102470 0 为此 我编写了以下基本 yacc lex 语法 词法分析器 语法上 include
  • 如何使用 onAuthStateChanged 将 Firebase 身份验证与 Redux Toolkit 结合使用?

    我正在尝试通过 Redux Toolkit 实现 Firebase 身份验证 但我认为由于缺乏知识我错过了一些东西 My monitorAuthChange回报undefined 我有两个单独的文件 第一个是 firebase 函数列表 第
  • 泛型和 Class.asSubclass

    我一直认为以下应该有效 我得到一个我知道是 a 的对象Class
  • Asp.net:替换 GenericPrincipal

    我想知道最好的方法是什么 用我自己的自定义 GenericPrincipal 替换 genericPrincipal 目前我有类似的东西 但我不确定它是否正确 protected void Application AuthenticateR
  • Oracle SQL Developer 初始化欢迎页面时出现问题

    我安装了 Oracle Sql Developer 但没有看到启动页面 遇到 JavaFx 错误 我怎么解决这个问题 手动破解 如果您不关心欢迎页面而只想消除错误 则可以阻止在启动时显示欢迎页面 查找包含启动时显示欢迎页面的设置的文件 No
  • 从包含合并单元格的表格中删除列

    我正在尝试从具有水平合并单元格的表中删除列 Selection MoveEnd Unit WdUnits wdCell Count 3 Selection Columns Delete 即使列被删除 合并的单元格也会在此过程中被删除 留下一
  • 我可以在不复制 C# 8 中的元素的情况下对结构数组进行 foreach 吗?

    随着新C 8 中的只读实例成员功能 https learn microsoft com en us dotnet csharp language reference proposals csharp 8 0 readonly instanc
  • 过滤出现在两个标记之间的文本

    Part 1 创建仅输出由两个预定义标记包围的文本的文本过滤器的最简单方法是什么 我不介意使用任何标准工具 sed awk python 例如 我希望只显示由 标记开始 和 标记结束 包围的文本 input Text 1 Mark Begi
  • 如何使用标头和数据创建对服务器的 javascript POST 请求

    我使用 JS 自动化框架来测试 iOS 应用程序 在测试过程中 我需要向服务器创建 POST 请求 向用户发送一些钱 然后验证更改是否反映在 UI 中 请求如下 wwww testserver com userAddMoney user i
  • 将 Laravel 请求中的数组值转换为整数

    我想要array diff Laravel 中的两个数组 第一个数组如下所示 array 4 0 gt 7248 1 gt 7249 2 gt 7250 3 gt 7251 第二个 array 4 0 gt 7248 1 gt 7249 2
  • 在 R 中裁剪光栅

    我正在绘制美国东北部的地图 地图背景需要是海拔图或年平均温度图 我有来自 Worldclim org 的两个栅格 它们为我提供了这些变量 但我需要将它们裁剪到我感兴趣的状态范围 有关如何执行此操作的任何建议 这是我到目前为止所拥有的 loa
  • MySQL:索引可变长度的json数组?

    我想做一个tags类型列json e g id tags 1 tag1 tag2 tag3 2 tag1 tag3 tag5 tag7 3 tag2 tag5 我想为每个索引tag在数组中 不知道数组的长度 可变长度 那么如果我查询包含的行
  • 将大量数据从 NIST 更改为 RIFF wav 文件

    所以 我正在编写一个语音识别程序 为此 我从 TIMIT 下载了 400MB 的数据 当我打算读取 wav 文件时 我尝试了两个库 如下所示 import scipy io wavfile as wavfile import wave fs
  • 向客户展示应用程序的测试版

    我可以向客户发送可以在模拟器中运行的 iOS 应用程序的测试版吗 我可以在 Mac 上仅安装模拟器 不带 Xcode 吗 实际上 我需要一种有效的方法来向他发送应用程序的测试版 而不必在每次更新时与他见面 另外 3 有没有办法安装我在 iO
  • 当指定 -g 时,gcc 会定义什么吗?

    很快 我想知道 gcc 或 g 我需要它C 但也对 c 感到好奇 定义了任何特殊符号 如果 g已启用 可以 如果是的话 是什么符号 在搜索过程中我发现 DEBUG是手动定义的 手动我的意思是 D DEBUG 并且是 Visual C 程序员