【问题标题】:Is there a way to assign a value to a macro by reading a value from another file?有没有办法通过从另一个文件中读取值来为宏分配值?
【发布时间】:2017-11-13 14:23:48
【问题描述】:

我正在从事 C++ 项目。我有一个名为 "version" 的文件,其中只有像 12343 这样的数字以数字形式定义 [实际上是版本]。 这个 "version" 文件在库 A 中定义。 不知何故,我需要将此值分配给另一个库 B 文件中的宏。

有什么办法吗?

由于作品是官方的,所以这里不能分享代码。

【问题讨论】:

  • “库A”采用什么形式?如果它是一个已编译的 blob,那么在编译时从中提取任何有用的东西将是相当棘手的。作为构建系统的一部分,您可能会在预处理/代码生成步骤中做得更好。
  • 所以你的名为“version”的文件是一个只包含一行的文本文件,例如12343?请edit您的问题并明确那里
  • 这似乎是重复的:How Can I read a file at preprocessing time 今天询问(可能是同一用户)
  • @VTT 不太一样,这里他想将一行文件的内容放入#define (至少我是这么理解的)并且在你提到的问题中他想要为全局变量赋值。
  • @MichaelWalz:是的,文件名是“版本”,它包含您提到的版本号。现在我只需要在预处理期间将此值分配给宏。这将使我能够根据宏的值使用一些编译器保护。

标签: c++ c


【解决方案1】:

C 和 C++ 都没有允许您将宏的扩展文本设置为在编译时从外部文件读取的语言功能。相反,此类任务通常分配给构建系统。

为此目的有多种机制,但它们遵循以下一般程序:

  • 外部程序读取包含所需文本的文件

  • 那个程序也可以

    • 格式化传达定义的编译选项的文本(例如-DVERSION=${what_I_read_from_the_file}),或

    • 写入一个包含宏定义本身的头文件,例如

      #define VERSION version-text-from-the-file
      
  • 1234563需要宏#includeing 生成的头文件。

【讨论】:

  • 对于前者,不需要(新的)外部程序——你可以在命令行中使用-DVERSION=$(cat version),让shell为你做扩展......
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 2021-12-27
  • 2018-03-05
  • 1970-01-01
  • 2014-02-11
  • 2016-11-02
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多