我不知道這是可能的,甚至也不是,如果它是正確的,但我已經在.c文件中定義的宏和現在我要揭露,宏觀,所以我需要把它放在.h文件。但我不希望暴露它是如何實現的,只是使用的簽名。如何實現一個宏.C,但其暴露在用於.h文件
//.c
#define sayhi() printf("hi");
//.h
sayhi()
//another.c
int main(...) {
sayhi();
}
我不知道這是可能的,甚至也不是,如果它是正確的,但我已經在.c文件中定義的宏和現在我要揭露,宏觀,所以我需要把它放在.h文件。但我不希望暴露它是如何實現的,只是使用的簽名。如何實現一個宏.C,但其暴露在用於.h文件
//.c
#define sayhi() printf("hi");
//.h
sayhi()
//another.c
int main(...) {
sayhi();
}
宏沒有簽名功能的方式,它們只存在於預處理階段的持續時間。你要麼必須使它成爲一個函數,要麼使實現成爲一個函數。
不要讓宏然後。只需將它作爲函數調用即可。
您的.h文件中:
extern void DoSomething(int x, int y, int z);
你的.c文件:
void DoSomething(int x, int y, int z)
{
// your code goes here.
}
預處理沒有像C源代碼聯動語義什麼,所以什麼宏展開將取決於預處理器所看到的最後一個定義。出於這個原因,你真的需要將宏的定義保存在頭文件中。
兩種方法浮現在腦海中:
代表儘可能多的儘可能宏的功能函數,並宣佈在頭宏和函數原型。您可以將該函數的實現放在源文件中。
把宏的定義在一個私人的頭。
與說明性註釋你的公共報頭包含這一點。
// hi.h
#define sayhi()
// hi_internal redefines the above macros.
// It must be included after the above definitions.
#include "hi_internal.h"
任何不把'#define'放在頭部的原因? – Kevin
@Kevin不,我只是忘了:P – Fabricio