【问题标题】:GCC confusing standard header with personal one named the sameGCC 将标准头文件与同名的个人头文件混淆
【发布时间】:2018-06-06 20:37:06
【问题描述】:

在我正在进行的一个项目中,我将我的一个文件命名为 math.h,这显然也是 standard library header 的名称。

一切正常,直到我开始使用 gcc 的 -I 选项:我将文件分类到单独的目录中,例如 srcobjinc 用于标题。

我最终得到了类似的东西

gcc ... -Iinc/

现在我的问题是我使用的另一个库(SDL,顺便说一句)#includes standard math.h 标头(位于 /usr/include/math.h),GCC 提供了它我自己的 math.h(在 /home/me/my_project/inc/math.h 找到),显然这不会编译。

所以我的问题是,我怎样才能让 GCC 不认为我的标头是标准的?
当然我可以重命名文件,但这只是为了避免这个问题——即使我最终这样做了,我也希望知道解决方案,以防我再次遇到这个问题。

【问题讨论】:

  • 为什么您认为正确的解决方案不是重命名文件?如果有多个同名文件,编译器如何知道使用哪一个?
  • “重命名”文件的一种方法是将其放在子目录中。当您包含 时,不会与 混淆。但是您将不得不以一种或另一种方式重命名,任何其他解决方案都将是一个脆弱的黑客。
  • 不要用standard headers 命名你的文件。你真的不想混淆你的读者(也许你自己,几个月后)。您应该尝试编写可读代码。因此,将您的 math.h 重命名为 jo_math.h 或其他一些独特的名称
  • “医生,医生!我这样做的时候很痛……”

标签: c gcc include


【解决方案1】:

必须重命名您的文件。 C11 标准说在当前状态下行为是未定义的。 C11 7.1.2p3

  1. 如果将与上述<> 分隔序列之一同名的文件放置在搜索包含源文件的任何标准位置,则行为未定义。

否则,如果您正在编译内核或类似内容,请使用-ffreestanding

【讨论】:

  • 好吧,如果标准这么说...我只是不明白 未作为实现的一部分提供 部分。我确实提供了标题的来源,对吧?除非他们的意思是标准标题?
  • @joH1 表示您的math.h 文件。它不作为(编译器和标准库的)实现的一部分提供,它存储在搜索包含的源文件的位置(即感谢-I),它的名称与< 和上面列表中的>分隔序列,即<math.h>
  • 好的!谢谢,+1 的工作。无论如何,我发现somewhere else 一个有效的技巧:使用-iquote 而不是-I。不过,它可能只是一个 GCC 扩展。
  • 它们都是 GCC 扩展。我仍然会重命名文件。但是,是的,这会改变它,这样您的目录就不会是查找 <math.h> 的目录之一。您可以将其添加为答案。
  • 另一个(也许是最重要的)避免将标题简单地指定为 "math.h" 的原因是您不想混淆读者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2010-11-29
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多