2016-11-24 46 views
0

我在我的C++測試代碼中有簡單的委託函數。由於我不能包含原始實現.cpp文件(嵌入式文件),因此我在PC上運行的測試中使用代理.cpp文件。我的想法是簡單地使用相同的宏作爲實現的主體,除了根據簽名提供的括號()和參數。C++命名空間作爲宏值

我想是這樣的:

void Flash::init() 
{ 
    DELEGATE_DESTINATION(); 
} 

bool Flash::write(args) 
{ 
    DELEGATE_DESTINATION(args); 
} 

bool Flash::read(args) 
{ 
    DELEGATE_DESTINATION(args); 
} 

void Flash::init() 
bool Flash::write(args) 
bool Flash::read(args) 

是相同的嵌入式項目實施的人的人。在測試文件中,我只是將調用中繼到假實現。我知道,一種可能的解決方案是已經在不使用中繼的假類中包含簽名和實現。

我很難搞清楚這個宏。我想是這樣的:

#define FAKE_PREFIX    fakes::device::Flash:: 
#define DELEGATE_DESTINATION FAKE_PREFIX##__FUNCTION__ 

它擴展到FAKE_PREFIX__FUNCTION__

那好吧經歷C Preprocessor, Stringify the result of a macro 我只能得到假貨到位後展開。

我的目標是能有像

fakes::device::Flash::init 

等爲閱讀結果。

+0

你可以使用內聯名字空間 –

+0

@GuillaumeRacicot你能給我一個例子,你有什麼想法。我檢查出來試了一下,但沒有得到任何簡明的結果......謝謝。 – arapEST

+0

我喜歡,但不幸的是我的內聯命名空間的經驗是有限的。我只知道這裏是爲了「默認」選擇一個嵌套的命名空間。 –

回答

0

你想做什麼可以做得更簡單。你不需要預處理器的全功率:

  1. 你不置標記(::是不是一個有效令牌的一部分)。您只需要在另一個宏旁邊打印一個宏。

  2. _FUNCTION_不是預處理器宏,它是一個字符串文字(in gcc和其他編譯器)。

所以,做你想做什麼,你需要的函數名傳遞到您的宏:

#define FAKE_PREFIX fakes::device::Flash:: 
#define DELEGATE_DESTINATION(func) FAKE_PREFIX func 

然後你定義的功能,如:

bool Flash::write(args) 
{ 
    DELEGATE_DESTINATION(write)(args); 
} 

這一切都住here

+0

我仍然使用'未聲明的標識符'FAKE_PREFIX__FUNCTION __'' – arapEST

+0

@arapEST,請參閱我的編輯。 – StoryTeller