如何在编译时显示 #define 的值?

2023-12-03

我试图找出我的代码认为它使用的 Boost 版本。我想做这样的事情:

#error BOOST_VERSION

但预处理器不会扩展 BOOST_VERSION。

我知道我可以在程序运行时将其打印出来,并且我知道我可以查看预处理器的输出来找到答案。我觉得在编译过程中找到一种方法可能会很有用。


我知道这距离原始查询已经过去很长时间了,但这可能仍然有用。

这可以在 GCC 中使用字符串化运算符“#”来完成,但需要首先定义两个附加阶段。

#define XSTR(x) STR(x)
#define STR(x) #x

然后可以通过以下方式显示宏的值:

#pragma message "The value of ABC: " XSTR(ABC)

请参阅:gcc 在线文档中的 3.4 字符串化。

怎么运行的:

预处理器理解带引号的字符串,并以不同于普通文本的方式处理它们。字符串连接是这种特殊处理的一个例子。消息杂注需要一个带引号的字符串参数。当参数有多个组件时,它们必须都是字符串,以便可以应用字符串连接。预处理器永远不能假设应将未加引号的字符串视为已加引号的字符串。如果是的话:

#define ABC 123
int n = ABC;

不会编译。

现在考虑:

#define ABC abc
#pragma message "The value of ABC is: " ABC

这相当于

#pragma message "The value of ABC is: " abc

这会导致预处理器警告,因为 abc(不带引号)无法与前面的字符串连接。

现在考虑预处理器 stringize (曾经称为 stringification,文档中的链接已更改以反映修订后的术语。(顺便说一句,这两个术语同样令人讨厌。当然,正确的术语是 stringifaction。准备好更新您的链接。))运营商。这只作用于宏的参数,并将未扩展的参数替换为用双引号括起来的参数。因此:

#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);

将为 s1 和 s2 分配相同的值。如果运行 gcc -E 您可以在输出中看到这一点。也许 STR 更适合命名为 ENQUOTE 之类的名称。

这解决了在未加引号的项目周围加上引号的问题,现在的问题是,如果参数是宏,则宏将不会被扩展。这就是需要第二个宏的原因。 XSTR 扩展其参数,然后调用 STR 将扩展的值放入引号中。

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

如何在编译时显示 #define 的值? 的相关文章

  • 使用 Intellij 调试 Scala 宏

    我有一个 sbt 项目 我运行 gen idea 来设置它以与 Intellij 12 4 一起使用 在一个项目中是我的主代码 另一个项目中有我的宏代码 当尝试通过以下测试文件调试我的宏时http docs scala lang org o
  • 错误:没有这样的文件或目录 - C

    解读完这个之后comment https stackoverflow com questions 41281332 code directory structure library design comment69813504 412816
  • 编译时检查函数是否使用/未使用 C++

    我想在编译时检查是否有某些函数某堂课使用 未使用 相应地使编译过程失败 通过 例如如果函数F1在代码中的某处调用我希望编译成功 并且 if 函数F2称为我希望它失败 关于如何使用预处理器 模板或任何其他 C 元编程技术来做到这一点 有什么想
  • 如何用其他树替换子树?

    在 Scala 宏中 我想做这样的事情 我有一个Tree 可能很大 现在我想找到这棵树的一个具有某种具体形式的子树 例如Apply 现在我想创建一棵新树 它是原始树的副本 但找到的子树被其他树替换 例如 通过类似的方法 我可以用调用某些其他
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 为什么要在项目中使用#include_next?

    引用iOS有关包装器标头的文档 http developer apple com library ios documentation DeveloperTools gcc 4 0 1 cpp Wrapper Headers html inc
  • C 中类似函数的宏定义

    我想定义一个像 MACRO 这样的函数 IE define foo x if x gt 32 x else 2 x endif 那是 if x gt 32 then foo x present x else foo x present 2
  • 使用 ## 和 __LINE__ 创建 C 宏(与定位宏的标记串联)

    我想创建一个 C 宏来创建一个基于名称的函数 在行号上 我想我可以做类似的事情 真正的函数在大括号内有语句 define UNIQUE static void Unique LINE void 我希望能扩展到类似的内容 static voi
  • #elif 定义时不带括号

    使用 VS2005 和 BLAH BLAH 定义以下预处理器条件为 false elif defined BLAH BLAH 但如果我把它改成 elif defined BLAH BLAH 是真的 为什么括号在这里会有所不同 它应该没有任何
  • 使用另一个宏(c 预处理器)生成宏的名称[重复]

    这个问题在这里已经有答案了 我可以使用宏生成函数的名称 该宏取自生成函数名称的 C 预处理器定义 https stackoverflow com questions 1253934 c pre processor defining for
  • 如何在 VS Code 宏中将焦点返回到编辑器,将 Python 文本发送到调试控制台?

    我尝试按键绑定宏以将 python 文本发送到调试控制台并将焦点返回到 Visual Studio Code 中的编辑器 这是我尝试过的 安装了vscode python https marketplace visualstudio com
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何使用可变参数宏调用嵌套构造函数?

    我正在尝试在 Rust 中创建一个宏 让我可以编写 make list 1 2 3 代替 Node new 1 Node new 2 Node new 3 None 它应该适用于任意数量的 参数 包括零 这是我到目前为止所拥有的 macro
  • 结合 C++ 和 C - #ifdef __cplusplus 如何工作?

    我正在从事一个有很多遗产的项目C代码 我们已经开始使用 C 进行编写 目的是最终转换遗留代码 我有点困惑如何C和C 交互 我明白 通过包装C代码与extern C C 编译器不会破坏C代码的名称 但我不完全确定如何实现它 所以 在每个的顶部
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 是否可以在 C 中自动生成的变量名中使用 __LINE__ ?

    为了避免重复 我想使用 LINE 在自动生成的变量名称中 define ROUTE path impl char k impl LINE route path impl 但它始终被视为普通字符串 LINE 即使我将其定义如下 我也无法得到我
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • Clang 中所有 Objective-C 预处理器指令的列表

    Clang 中是否有所有 Objective C 预处理器指令的列表 我说的是 pragma mark Section I or pragma unused variableName or warning message 我想了解更多信息以
  • 如何在 Clang 中检测 libstdc++ 版本?

    我想用 Clang 编写一个 可移植 C 库 可移植 意味着我 在 C 预处理器中 检测编译环境中可用的 C 功能 并使用这些功能或提供我的解决方法 这与 Boost 库所做的类似 然而 某些功能的存在并不取决于语言 而是取决于标准库的实现

随机推荐

  • mongodb是否会自动在嵌入文档的_id字段上创建索引?

    在 node js 项目上使用 mongodb 和 mongoose 我想知道是否必须在嵌入项目的 id 字段上确保索引 也就是说 我看到 mongodb 自动在集合的 id 字段上创建索引 它是否也对嵌入集合的 id 字段执行相同的操作
  • 使用反射在抽象类中创建实例

    是否可以使用反射在抽象祖先类中创建派生类的实例 可以说 abstract class Base public Base createInstance using reflection Class ctor c getConstructor
  • Google 日历 api(超出日历使用限制)

    我在我的 php 项目中使用 Google Calendar Api 每天在执行插入查询时都会收到 超出日历使用限制 消息 但删除和列表方法工作正常 这是我的插入功能 谁能帮我 function insertEvent start end
  • 使用复选框在 ReactJS 中保存表单值

    我使用反应钩子表单创建了一个表单组件 该组件由一组复选框和一个文本输入组成 当用户单击最后一个复选框时出现文本输入custom 这个的想法是 当用户单击时 会出现一个文本输入 并且用户可以添加自定义答案 选项 例如 如果用户输入test在输
  • Django:通过查询计算列值的总和

    我有一个模型 class ItemPrice models Model price models DecimalField max digits 8 decimal places 2 我尝试用这个来计算总和price在此查询集中 items
  • 两个卷积层之间的互连

    我有一个关于 CNN 中两个卷积层之间互连的问题 例如假设我有这样的架构 输入 28 28 conv1 3 x 3 滤波器 编号 过滤器数量 16 conv2 3 x 3 滤波器 编号 过滤器数量 32 假设图像尺寸没有减小 经过 conv
  • 值传递和 std::move 相对于引用传递的优点

    我现在正在学习C 尽量避免养成坏习惯 据我了解 clang tidy包含许多 最佳实践 我尝试尽可能地坚持它们 尽管我不一定理解why它们还被认为是好的 但我不确定我是否理解这里推荐的内容 我使用了教程中的此类 class Creature
  • 如何使用 Mongoose 删除数据库?

    我正在 Node js 和 Mongoose 中准备一个数据库创建脚本 如何检查数据库是否已存在 如果存在 则使用 Mongoose 删除 删除 它 我找不到用 Mongoose 删除它的方法 没有方法可以从猫鼬中删除集合 您能做的最好的事
  • Oracle 根据出生日期和今天计算年龄

    我想在 Oracle 函数中根据出生日期计算当前年龄 我正在使用的是 Today Dob 30 12 但这并不准确 因为有些月份有 31 天 我需要以最高精度获得正确的年龄 我怎样才能做到这一点 SQL gt select trunc mo
  • 带有附加列的sql批量插入

    csv 文件包含 8 列 col1 col2 col8 文件名也包含必须插入表中的日期 如果表中的列数和 csv 文件中的列数相等 则以下查询将文件中的所有记录导入到表中 query BULK INSERT real data FROM p
  • 如何从分类分布中抽取样本

    我有一个 3D numpy 数组 其中最后一个维度中包含每个类别的概率 就像是 import numpy as np from scipy special import softmax array np random normal size
  • 在控制台显示上对齐 printf() 列并防止溢出到下一行?

    printf processid t threadid t refilling t drinking t thinking t waiting t terminated t p type t required t consumed t wa
  • 如何在循环中追加多个 pandas DataFrame?

    我已经在这个 python 问题上苦苦挣扎了一段时间 但陷入了困境 我正在循环遍历多个 csv 文件 并希望有一个数据框以每个 csv 文件中的一列作为列名称并设置 date time 的公共索引的方式附加 csv 文件 有 11 个 cs
  • RoR 3 限制用户每天发帖 2 条

    我正在寻找方法限制我的用户每天发帖次数不超过两次 并且每周发帖次数不超过 5 个 我有一个用户和帖子模型 控制器 我一直在研究这些问题 但它们并不完全是我想要的 Rails 3 1 限制用户创建的对象 如何验证 Rails 中的时间 限制用
  • Fortran if 语句中的隐式转换整数 <--> 逻辑

    我有一些遗留的 Fortran 代码 我被要求分析它们并将其翻译成现代语言 我不知道过去使用哪个编译器来编译代码 所以现在我尝试使用 gfortran 来编译它 该代码包含这样的语句 导致 gfortran 抱怨 program test
  • 将元素形成 numpy 数组作为另外两个 numpy 数组时出现广播错误

    我正在尝试生成一个 numpy 数组 其元素作为另外两个 numpy 数组 如下所示 W1b1 np zeros 256 161 W2b2 np zeros 256 257 Wx np array W1b1 W2b2 dtype np ob
  • 具有空布局的 JPanel 类不显示组件

    因此 我创建了一个 CustomPanel 类的对象 该对象创建一个带有 GridLayout 的 JPanel 和其中的标签 然后将其添加到我的 JFrame 中 它可以很好地显示标签 HELLO 但是当我将 jpanel 的布局管理器更
  • 带有单位的 POSIXct 的差异,就像 difftime 一样

    我有一个 POSIXct data 向量 想要计算连续元素之间的差异 就像通过diff e g burst lt as POSIXct c 2016 11 07 17 20 52 2016 11 07 16 21 52 2016 11 07
  • constexpr 和 RTTI

    我想做这样的事情 template
  • 如何在编译时显示 #define 的值?

    我试图找出我的代码认为它使用的 Boost 版本 我想做这样的事情 error BOOST VERSION 但预处理器不会扩展 BOOST VERSION 我知道我可以在程序运行时将其打印出来 并且我知道我可以查看预处理器的输出来找到答案