2011-08-25 118 views
1

編譯完程序後,我必須使用頭文件。由於客戶請求,此頭文件從服務器下載。在頭文件中有3個數組和1個int,我希望在執行過程中讀取它們。如何在執行過程中使用.h文件而不用C++編譯它?

我的第一個解決方案是編寫一個解析器。頭文件總是有相同的模式,所以我可以寫4行來讀取數組和int。

有沒有其他解決方案? ho知道,也許是一個動態的include和一個預編譯的頭文件。


這是一個完整的解釋:

我正在開發使用高通公司AR SDK原生Android應用程序。

一種技術使用自己的3D模型,使用該perl腳本:http://heikobehrens.net/2009/08/27/obj2opengl/。基本上你需要2個文件:包含頂點,法線和紋理座標的頭部和紋理。上面的腳本可以從.obj文件中產生這個頭文件。

好了,現在你準備在本地C/C++用來渲染模型這兩個文件。您可以編譯這個頭並將其包含在您的應用程序的任何位置。但是,例如,當用戶按下按鈕時,我的應用程序需要下載此標題和紋理。紋理很容易閱讀,但我也需要在執行時讀取標題。因爲我不是C/C++專家,所以我問這裏是否有機會在執行時連接頭文件。

但現在並不重要,怎麼一回事,因爲我所著解析器這樣我就可以在執行時使用的頂點,紋理COORDS和法線。

+0

'我必須在編譯程序之前使用頭文件'這就是通常使用頭文件的方式。在單個源文件中包含頭文件並使用其中定義的任何東西有什麼問題? – Praetorian

+4

聽起來像你正在使用頭文件,如配置文件。 –

回答

8

C++(通常)一個靜態編譯語言。你編譯它,並獲得一些可執行代碼,你可以運行它。編輯之前和之後的兩個階段與彼此沒有任何關係。在編譯時,您只處理C++源代碼,只有

而在運行時,您將處理從所有源代碼生成的單個編譯程序。

一般沒有辦法一旦被編譯源代碼以「添加」到一個程序。

(我在這裏簡化了一下,我希望nitpickers見諒)

你需要做的,而不是什麼治療是「頭」的數據,而不是代碼。

它是一個包含三個數組和一個int的數據文件。您需要編寫程序來打開該文件,閱讀其內容,解析它並執行必要的操作。

爲了做到這一點,你需要尋找到文件I/O讀取的文件,字符串處理,以處理其內容,然後一些邏輯來創建變量來保存在數據文件中指定的數據。

但是,你不能只是「插入」新的代碼。

+3

+1這是答案應該如何處理。如果只有所有的SO用戶都耐心記住這個任務就是幫助程序員。 – codenheim

3

不,你必須編寫一個解析器。有些語言在運行時可以包含新代碼,但C++不是其中之一。

+0

您可能會提到,如果已經編譯了新的代碼(動態鏈接),那麼可以採用新代碼,但這些方法與OP的問題無關。 –

3

爲了補充jalf的回答(現在問題已經重新打開......謝謝)如果你的目標是使用頭文件中的常量值作爲配置文件,那麼實現一些簡單的正則表達式解析器就足夠了。

只要確保你需要用常量修改的變量實際上是變量,而不是常量本身,或者你不能在運行時修改它們。

即。如果你想從config.h中讀取MAX_FILES,不要使用默認的#define MAX_FILES 255或const int MAX_FILES = 255進行編譯。使用「int maxFiles = 255」,然後在運行時用你的配置值覆蓋它。

如果我誤解了,道歉,希望這有助於。

-1

聽起來就像你試圖使用配置文件。你有控制服務器上文件的格式嗎?如果是這樣,這裏最簡單的方法是用像xml這樣的標準格式編寫你的配置文件,然後使用類似rapidXML的庫來解析配置文件,當你收到它們時

關於使用標準格式的好處是如果您稍後決定更改配置文件格式,請添加到它等等。這將是對您的代碼進行相對簡單的更新以解析更新的文件。通常比重新編寫自定義分析器的工作量少。

如果您無法控制服務器文件的外觀,並且它們不是像JSON,XML,YAML等標準格式,則必須編寫您自己的自定義分析器。聽起來這是一個相對簡單的文件,所以這不應該太難。

+0

這聽起來很清楚,格式是一個C++頭文件,他從外部源接收。 –

+0

在這種情況下,他應該根據我的答案的第三部分編寫自己的自定義分析器。我只是指出,如果事實上他對這些數據的存儲方式有一些說法,那麼使用標準化的數據格式和解析器可能是一個更好的主意。通過網絡發送C++頭文件並不是特別常見。這聽起來像是他試圖根據服務器的文本文件初始化他的程序中的一些值,並且他對如何在代碼中包含這些值感到困惑(因此詢問如何將頭添加到他的編譯的可執行文件中)。 – wallacer

相關問題