【问题标题】:How to parametrize modules in C++20?如何在 C++20 中对模块进行参数化?
【发布时间】:2019-11-14 10:44:21
【问题描述】:

我的意思是这样的情况:

#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>

这个确切的例子可能很少用,但这只是一个例子,这种方法被广泛使用,尤其是在项目内部。为系统或编译器类型和版本定义的宏采用类似的方式,编译器命令行中定义的宏也是如此。

我的问题是,当您已经有一个使用普通名称的模块时,是否存在某种机制可供即将使用import 声明的开发人员使用,如下所示:

#define __STDC_FORMAT_MACROS 1
#export __STDC_FORMAT_MACROS
import std.inttypes;

或者,也许更好 - 指定导出到模块的参数专门用于它(不会传播到其他模块)。有没有什么机制可以实现?

【问题讨论】:

  • 仅供参考:在这种特殊情况下,这种参数化将毫无意义。 __STDC_FORMAT_MACROS 用于告诉头部声明一些宏; imports 的实际模块无法导出宏。只有遗​​留模块头可以。
  • @NicolBolas:我的问题不在于模块是否可以在导入它们之前看到定义的宏,而是是否提供了任何可用于实现类似结果的功能。
  • 你错过了我的意思。即使有一个特性,在这种情况下也无济于事,因为那个特定的“参数”会导致标题生成宏。而且您不能在实际模块中使用import 宏。
  • 但是上面的例子并没有 import 模块中的宏——它声明了一个旨在在模块内被看到和解释的符号。如果您谈论的是inttypes.h 提供的特定宏,那超出了问题的范围。
  • 我知道这超出了问题的范围。这就是为什么我将其设为“供您参考”评论而不是我的答案的一部分。我的观点很简单,在这种特殊情况下,它不会完成任何事情,因为该宏更改的特定内容不会通过模块导入可见。所以你的具体例子根本没有用。这就是我要说的。

标签: c++ c++20 c++-modules


【解决方案1】:

大约 80% 的模块是一个模块是一个固定的对象,它的定义完全不受模块本身之外的任何东西的影响。如果您可以“参数化”它们,那会使它们变得毫无价值,因为每次导入模块时,都必须重新编译它。这正是存在要防止的问题模块。

模块接受的唯一参数是编译器的命令行参数,就像任何其他翻译单元一样。

【讨论】:

  • 我不明白为什么参数化必须是“不可能的”。首先,模块内部的代码必须能够访问编译器定义的宏,以便提供系统或编译器依赖的部分代码,否则这个特性几乎不会被采用。
  • 示例:我们有一个加密库的包装器,它的实现可以为openssl、gnutls和mbedtls提供,哪一个是在编译时定义的。如果我们不能通过条件编译来使用模块,我们如何使用它们?
  • "如果我们不能通过条件编译来使用模块,我们如何使用它们?" 最后一句话告诉你如何:你使用命令行参数。不允许对模块做的事情是根据与另一部分不同的规则编译程序的一部分。
  • "模块内的代码必须能够访问定义的宏";是的,它确实。但那是你编译模块的时候,而不是你 import-ing 的时候。
  • @Ethouris:对于少数变体,没有什么能阻止您使用通常的预处理器机制创建许多共享(大部分)代码的模块。
猜你喜欢
  • 2015-05-14
  • 2021-08-02
  • 2020-10-27
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多