【问题标题】:Is there a way to check if <string.h> is included?有没有办法检查是否包含 <string.h> ?
【发布时间】:2021-04-24 17:03:13
【问题描述】:

我正在创建一个仅标头库,并且我想检查用户是否定义了 以便我可以使用 memcpy。我在网上阅读了有关 stdio 之类的库如何具有保护宏的信息,但我找不到 string.h 的。有任何想法吗?或者有没有办法查看 memcpy 是否是一个函数?

【问题讨论】:

  • 你为什么不自己#include &lt;string.h&gt;?或者只是在您需要的源文件顶部转发声明void *memcpy(void *, const void *, size_t);
  • 我想我只是从未听说过有人拥有根据调用者包含的内容有条件地运行的代码路径。这是您正在组合的“仅标题”库吗?
  • @selbie 是的,它只是一个库的标题,所以我的理由是我应该尽可能地保持它的简洁性。
  • 有什么想法吗?只需#include &lt;string.h&gt;。如果您的图书馆的用户也自己包含它,那将没有问题。 或者有没有办法只查看 memcpy 是否是一个函数? 不,不是通过预处理器。
  • 除了我对仅标头库的反感之外,我不同意您的推理。这是一个过度优化。您可以做的最好的混合解决方案可能是只使用 memcpy 而不显式添加#include &lt;string.h&gt;。任何包含您的库的值得他的盐的开发人员都会弄清楚如果他收到错误说 memcpy 未声明。这些都没有改变我的看法,即您过度优化并且只会使您的代码更难维护。 只需包含

标签: c macros c-preprocessor


【解决方案1】:

您可以方便地判断string.h 是否没有被包含。

根据(草案)C11 标准的7.24.1 String function conventions, paragraph 1

标题&lt;string.h&gt; 声明了一种类型和多个函数,并定义了一个宏,可用于操作字符类型数组和其他被视为字符类型数组的对象。类型为size_t,宏为NULL ...

如果NULL定义,则用户在包含您的标头之前不能包含string.h

我认为没有可移植的方法来明确确定 string.h 是否包含在内。

【讨论】:

  • WOW 不错,但坚持一下,你的意思是什么(草稿),这意味着它不在 C11 标准中?
  • @CEPB 这是 C11 标准最终草案副本的链接 - 为数不多的可用标准之一。实际标准的链接不存在 AFAICT - 实际标准的副本不是免费的,我怀疑它们是许可/出售的,但限制发布内容。由于那是最终草案,它可能与实际的 C11 标准相同,但我没有进行任何真正的检查。 AFAIK 没有人注意到与实际 C11 标准有任何差异。
  • 呃不知道你必须为此付费:(
  • @CEPB 见Where do I find the current C or C++ standard documents?。最终草稿是免费的,并且通常足以用于教育用途。除非您正在实现编译器或类似的东西,否则您不需要为标准付费。
  • 这就是我的“困惑”所在,请 GCCClang(GNU 项目和 LLVM)支付这些费用。
【解决方案2】:

如果您需要&lt;string.h&gt;,请自行添加。您也可以前向声明memcpy 并使用它而不包含任何内容:

void* memcpy( void *restrict dest, const void *restrict src, size_t count );

【讨论】:

  • 只有标题的库。所以如果我理解正确没有 .c 文件
  • 你的回答对我来说很好。我放弃了你。我知道最好的方法是包含它。我只是不想让你受到惩罚。
  • @CEPB 感谢您的反馈。我删除了那部分答案。
猜你喜欢
  • 2020-02-04
  • 2018-06-23
  • 2016-09-20
  • 2021-12-04
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多