2011-05-03 108 views
3

我想知道是否有可能在C中的main()函數中包含一些東西。#include裏面的main()函數

例如,在Cell程序中,我定義了cache-api.h的參數,稍後在我想要更改的main()函數中。

我知道用#define定義的東西可以用程序中任何地方的#undef來定義,但是在重新定義我需要的參數之後,我必須再次包含cache-api.h。那可能嗎?

我該如何解決這個問題更優雅?假設我想從cache_rd(...)的主存儲器中讀取,但是在執行SPU的過程中類型會有所不同,我如何在同一個程序中同時使用#define CACHED_TYPE struct x#define CACHED_TYPE struct y

在此先感謝您的答覆,我希望我的表達清楚。

+0

如果您想優雅地解決這個問題,請切換到面向對象的語言,並在運行時使用多態性在二者之間進行選擇。 – Blindy 2011-05-03 18:34:20

+0

不幸的是我不能這樣做,我在單元格中,我使用C – Madrugada 2011-05-03 18:46:19

+1

將你的程序分成不同的文件,並根據文件本地化文件的不同定義。 – 2011-05-03 18:49:58

回答

1

#define#include是預處理器宏:編譯之前http://en.wikipedia.org/wiki/C_preprocessor

它們被轉換/內聯。

要回答你的問題......不,你真的不想這樣做,至少爲了下一個必須嘗試解讀這個混亂的人。

+0

這隻回答第一個問題,第二個問題是如何更優雅地解決問題。 – Clifford 2011-05-03 19:50:58

+0

但是當我真的需要那麼我可以嗎? – 2016-12-23 10:39:01

3

#define#include只是在編譯的「預處理」階段發生的文本操作,這在技術上是一個可選階段。所以你可以以各種方式混合和匹配它們,只要你的預處理器語法正確,它就可以工作。

但是,如果您使用#undef重新定義宏,您的代碼將很難遵循,因爲相同的文本在代碼的不同位置可能有不同的含義。

對於自定義類型typedef,但最好在可能的情況,因爲你仍然可以從編譯器的類型檢查機制中獲益,它是不太容易出錯,因爲它比#define宏不太可能會對周圍的意想不到的副作用碼。

+0

我認爲這是一個問題,因爲它將錯誤指向我的#include 在主函數內,其次是:函數'CACHE_cache_lock'....(更多函數)的無效存儲類..我能從中理解什麼? – Madrugada 2011-05-03 18:47:06

2

是的,這很好(可能不是最清晰的設計決定),但#include就像該文件複製並粘貼到#include所在的代碼中一樣。

0

你可以#include任何文件在任何文件。它是否有效取決於文件的內容;特別是如果該內容直接作爲文本輸入,則該內容是否有效。

頭文件通常包含聲明和結構,通常只在函數定義之外(或任何類型的編碼結構之外)有效 - 線索名稱爲頭文件文件。否則,您可能會更改聲明的範圍,或者更可能使編譯單元在語法上無效。

爲此目的專門編寫的包含文件可能沒有問題,但不是任何任意的頭文件。

通用頭文件應該包含防護以防止多重聲明,因此,除非您取消定義防護宏,否則重新包含頭文件在任何情況下都不起作用。

您的問題的一種可能的解決方案是創建單獨編譯的模塊(編譯單元)包含包裝函數到你需要調用的API。然後,每個編譯單元可以在定義適當的配置宏之後包含API頭文件。然後你將有兩個由這些包裝函數提供的獨立和獨立的接口。