<string.h>与我自己的String.h </string.h>冲突

时间:2010-06-26 18:43:29

标签: c++ string xcode header conflict

我有一个在g ++中编译好的项目(我现在看不到版本),而现在在xCode上则不是。
我认为我现在遇到了问题...我的项目中有一个String.h文件,似乎xCode编译器(即gcc)试图从&lt;中添加我自己的字符串文件。 cstring&gt; ...我不确定,但看看这张照片 http://www.jode.com.br/Joe/xCode1.png

从它的外观来看,它包括我自己而不是系统文件,我想知道......不应该#include&lt;档案&gt;是一个系统包括?因为&lt; &GT; ?并且系统不应该在其自己的路径中包含文件而不是我的应用程序的原始路径? 正如我所说,我不确定这是不是发生了什么事,因为我过去两天只是迁移到osx ...... 我打算将我的类和文件名更改为不冲突,所以它会起作用,如果这确实是问题,但我想知道,应该有另一种方法来做到这一点,因为现在我的项目不是那么大我可以在一段时间内完成这项工作,但如果项目更大,该怎么办?改变所有包含和类名是很困难的......

感谢任何帮助

谢谢,
乔纳森

6 个答案:

答案 0 :(得分:8)

我有同样的问题,很难解决。花了我几个小时来修理/找出答案。 问题是xcode的头图。和解决方案 - 除了避免那些保留名称,这是一个好主意,但并不总是可能与第三方库 - 是添加

USE_HEADERMAP = NO

到您的用户定义设置。

对这些家伙赞不绝口: http://meidell.dk/archives/2010/05/08/xcode-header-map-files/ http://www.cocoabuilder.com/archive/xcode/262586-header-file-problem-sorry-to-bug-this-list.html

答案 1 :(得分:4)

是的,如果您使用

#include "file"

首先查看本地目录并

#include <file>

只查看系统包含的文件夹。

仅在第一种情况下注意首先这个词。这意味着每次都包含您的本地版本时永远不应该到达(除非您已在INCLUDE指令中包含源路径)。

说,我的虚拟建议是用一个明确的名称重命名你的本地文件......

答案 2 :(得分:4)

使用与标准标题(例如 string.h )相同的名称命名标题,并将它们简单地包含在#include <String.h>中,这就是问题(套管的差异在某些平台上没有区别)

然而,正如您所说,在命名标题时,很难弄清楚这些是什么。因此,最简单的方法是设置将包含路径设置为标题所在的子目录之外的一个目录级别,例如:

#include <Jonathan/String.h>

现在您不必担心String.h文件名是否与您正在使用的库中的某些内容冲突,除非它们恰好也包括<Jonathan/String.h>,这不太可能。所有体面的第三方图书馆也这样做。例如,我们在boost中不包含<function.hpp>,而是包含<boost/function.hpp>。与GL / GL.h相同,而不仅仅是GL.h.这种做法在很大程度上避免了冲突,并且您不必通过将String.h重命名为Text.h来解决问题。

答案 3 :(得分:1)

在OSX上,文件系统不区分大小写 - 所以String.h可以解决类似的冲突。 String.h == string.h

答案 4 :(得分:1)

通过将名称从String.h更改为Text.h

来实现

但这没有任何意义,因为std库包含了它自己的string.h而不是我的 我的意思是,对于开发人员来说,创建他的文件,考虑他不能使用的名称是没有意义的,对于一个实例,我可以说我将String.h更改为Text.h(我已经做过,我需要工作,这个是不是让我)广告我不得不包括另一个模板库,其中包含一个名为Text.h的包含,我是否需要再次更改我的text.h或不使用这个新库?应该有另一种选择 或者不应该?

感谢迄今为止的帮助,
乔纳森

答案 5 :(得分:0)

您遇到的两件事:

  1. 如上所述,除非您专门将文件系统设置为区分大小写,否则Mac OS上的文件系统不区分大小写。
  2. gcc在本地和系统头包含路径之间没有区别。当您通过-I指定要添加到路径的目录时,该目录将用于定位本地和系统包含。只有在使用-iquote或-I-时才会跳过目录以查找系统包含。此外,编译器搜索路径上的内置“系统包含”目录始终搜索本地包含。
    • 请注意,当前目录用于本地但不包括系统。在这种情况下,我相信它正在拾取String.h,因为项目设置明确地将顶级项目目录添加到包含路径。
  3. 我建议的解决方法是将您的实用程序放入名称对于您的项目而言唯一的目录,而不是重命名您的包含,并在include指令中指定该目录。例如:

    #include "Josk/String.h"
    

    并确保Josk/本身不在您的包含搜索路径中。这样你就不会遇到笨拙的重命名,尽管你可能需要在项目中改变一些文件。您可能还需要编辑项目设置,以确保该实用程序目录的父目录位于包含路径中。

    尝试的另一种可能性是,如果您看到顶级项目目录已添加到项目的包含路径中,请将其删除。这应该使您的顶级项目目录中的项目不被搜索系统包含。

    最后,通过更改文件系统的区分大小写,您也可以在此特定情况下避免此问题。但是,这可能会打破一些Mac应用程序,所以在你开始这个之前研究这个问题 - 或选择一个没有其他用途的卷。