簡體   English   中英

<string.h>與我自己的String.h沖突

[英]<string.h> conflicting with my own String.h

我有一個項目在g ++中編譯好(我現在看不到版本),而現在在xCode上則沒有。
我認為我現在遇到了問題...我的項目中有一個String.h文件,似乎xCode編譯器(即gcc)試圖從<cstring>添加我自己的字符串文件...我我不確定,但看看這張照片
http://www.jode.com.br/Joe/xCode1.png

從它看起來像它,它包括我自己而不是系統文件,我想知道...不應該#include <file>是一個系統包括? 因為<>? 並且系統不應該在其自己的路徑中包含文件而不是我的應用程序的原始路徑?
正如我所說,我不確定這是不是發生了什么,因為我過去兩天只是遷移到osx ......
我打算將我的類和文件名更改為不沖突,所以它會起作用,如果這確實是問題,但我想知道,應該有另一種方法來做到這一點,因為現在我的項目不是那么大我可以在一段時間內完成這項工作,但如果項目更大,該怎么辦? 改變所有包含和類名是很困難的......

任何幫助表示贊賞

謝謝,
喬納森

我有同樣的問題,很難解決。 花了我幾個小時來修理/找出答案。 問題是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 -抱歉對bug的這個-list.html

是的,如果你使用

#include "file"

首先查看本地目錄

#include <file>

只查看系統包含的文件夾。

首先注意一種情況下的單詞。 這意味着每次都包含您的本地版本永遠不應該到達( 除非您在INCLUDE指令中包含了您的源路徑 )。

說,我的虛擬建議是用一個明確的名稱重命名你的本地文件...

使用與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來解決問題。

在OSX上,文件系統不區分大小寫 - 所以String.h可以解決這樣的沖突。 String.h == string.h

它通過將名稱從String.h更改為Text.h來工作

但這沒有任何意義,因為std庫包含了它自己的string.h而不是我的。
我的意思是,對於開發人員來說,創建他的文件,考慮他不能使用的名稱是沒有意義的,對於一個實例,我可以說我將String.h更改為Text.h(我已經做過,我需要工作,這個是不是讓我)廣告我不得不包括另一個模板庫,其中包含一個名為Text.h的包含,我是否需要再次更改我的text.h或不使用這個新庫? 應該有另一種選擇。
或者不應該呢?

感謝你目前的幫助,
喬納森

你遇到的兩件事:

  1. 如上所述,Mac OS上的文件系統不區分大小寫,除非您專門將文件系統設置為區分大小寫。
  2. gcc在本地和系統頭包含路徑之間沒有區別。 當您通過-I指定要添加到路徑的目錄時,該目錄將用於定位本地和系統包含。 只有在使用-iquote或-I-時才會跳過目錄以查找系統包含。 此外, 始終在編譯器的搜索路徑上搜索內置的“系統包括”目錄以尋找本地包含。
    • 請注意,當前目錄用於本地但不包括系統。 在這種情況下,我相信它正在拾取String.h,因為項目設置明確地將頂級項目目錄添加到包含路徑。

我建議的解決方法是將您的實用程序放入名稱對於您的項目而言唯一的目錄,而不是重命名您的包含,並在include指令中指定該目錄。 例如:

#include "Josk/String.h"

並確保Josk/本身不在您的包含搜索路徑中。 這樣你就不會遇到笨拙的重命名,盡管你可能需要在項目中改變一些文件。 您可能還需要編輯項目設置以確保該實用程序目錄的父目錄位於包含路徑中。

另一種嘗試的可能性是,如果您看到頂級項目目錄已添加到項目的包含路徑中,請將其刪除。 這應該保持您的頂級項目目錄中的項目不被搜索系統包含。

最后,通過更改文件系統的區分大小寫,您也可以在此特定情況下避免此問題。 但是,這可能會打破一些Mac應用程序,所以在你開始這個之前研究這個問題 - 或選擇一個沒有其他用途的卷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM