0

だから私はWindowsアプリケーションに取り組んでおり、com関連の関数が呼び出されたときに返されるHRESULTをチェックするために、いくつかのヘルパー関数を書くことにしました。これらの関数をマクロ #define ブロックに定義しようとしていますが、適切な構文が何かわかりません。#define ブロックの 2 つの関数を次に示します。2 つ目の関数は、プログラムの他の部分で呼び出すとコンパイラ エラーが発生します。

#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 でない場合は、エラーがスローされます。2 つ目は、エラー コードを人間が読める文字列に変換して返そうとします。これが私が得たエラーです(私が使用しているideはqtクリエーターですが、それは問題ではありません): ここに画像の説明を入力

_com_error が不正に使用されていると書かれており、他のエラーは #define ブロックの不適切な構文が原因であると思われます。誰かが私の構文の何が問題なのか指摘できますか?

4

1 に答える 1

1

定義マクロは、定義されているものをその定義に置き換えるようにプリプロセッサに指示します。だから行けば

#define SAMPLE_TEXT 5

プリプロセッサはすべてSAMPLE_TEXTの s を 5 に置き換えます。マクロ関数はもう少し複雑です。だから行けば

#define MACROFUN(a, b) a + b

プリプロセッサはすべてMACROFUN(a, b)a+bに置き換えますが、(a+b) や式の結果には置き換えません。したがって、行く2 * MACROFUN(3,3)と 9 になります (2 * 6 = 12 ではなく、2 * 3 + 3 = 9)。プリプロセッサは、値を評価せずに a、b を引数に置き換えて、マクロ関数の内容を貼り付ける仕事をしているだけです。

元の質問に戻って、ここで必要なマクロ関数を定義するには、おそらく行くべきです

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

ここでマクロの使用を避け、それらのマクロ関数を通常の関数にすることを検討してください。それらをインライン化するかどうかをコンパイラーに決定させます。

于 2015-12-16T22:23:36.490 に答える