2015-12-16 71 views
0

因此,我正在開發一個windows應用程序,並且我決定編寫幾個helper函數來檢查調用時由任何com相關函數返回的HRESULT。我試圖將這些函數定義爲一個宏#define塊,但我真的不知道什麼是適當的語法。以下是#define塊中的兩個函數,第二個函數在我的程序的其他部分調用它時給出編譯器錯誤。使用#define宏來檢查com結果的C++定義函數

#ifndef COMUTILITIES 
#define COMUTILITIES 
#include <sstream> 
#include <fstream> 
#include <string> 
#include <comdef.h> 
#include <AtlConv.h> 


#define COM_RESULT_CHECK(ret) \ 
    if (ret != S_OK) { \ 
    std::stringstream ss; \ 
    ss << "failed " #ret " " << std::hex << ret << std::endl; \ 
    throw std::runtime_error(ss.str().c_str());   \ 
    } 

#define TO_STRING(ret) \ 
    _com_error err(ret); \ 
    LPCTSTR errMsg = err.ErrorMessage(); \ 
    std::string s = CT2A(errMsg); \ 
    return s; \ 

#endif // COMUTILITIES 

基本上我的目標很簡單。第一個函數檢查com函數的返回碼。如果它不是S_OK,則會引發錯誤。第二個嘗試將錯誤代碼轉換爲可讀的字符串並將其返回。下面是我得到的錯誤(我使用的IDE是Qt Creator的,但是,這並不重要): enter image description here

它說_com_error被非法使用,和其他錯誤,我相信,通過在不良造成的語法#定義塊。有人能指出我的語法有什麼問題嗎?

+0

你有沒有想過使用['std :: system_error'](http://en.cppreference.com/w/cpp/error/system_error)? – Fireho

+1

您是否考慮過內聯函數?它們往往比宏更容易調試 – kchoose2

+0

函數和宏是完全不同的東西。 –

回答

1

定義宏指示預處理器用它的定義來替換定義的內容。 所以,如果你去

#define SAMPLE_TEXT 5 

預處理器將與5 微距功能全部更換SAMPLE_TEXT s爲更復雜一點。所以,如果你去

#define MACROFUN(a, b) a + b 

預處理器將取代所有MACROFUN(a, b)a+b,而不是與(A + B)或表達式的結果。因此,去2 * MACROFUN(3,3)將導致9(2 * 3 + 3 = 9,而不是2 * 6 = 12)。預處理器只是在將參數a,b替換爲參數而不評估任何值的情況下粘貼macrofunction的內容。

回到原來的問題,確定需要這裏宏功能,你應該去

#define TO_STRING(ret) (std::string(CT2A(_com_error(ret).ErrorMessage()))) 

考慮在這裏使用宏,使這些宏功能只是普通的功能避免。讓編譯器決定天氣來嵌入它們。

+0

這不回答問題。 –

+1

它確實很好地回答了這個問題。 –

+0

@CrazyEddie - 「爲什麼不編譯這個代碼?」 「好吧,這是一些不同的編譯代碼。」是的,有理由說這種方法行不通,但我在任何地方都看不到。只是漫無邊際的預處理和代碼示例。 –