簡體   English   中英

這些 C++ 宏在做什么?

[英]What are these C++ Macros doing?

我是 C++ 新手,並試圖了解這兩個宏在這個 FileMaker 插件示例中的作用。

#define FMX_PROC(retType)           retType __stdcall
#define FMX_PROCPTR(retType, name)  typedef retType (__stdcall *name)

到目前為止,我知道它們都是,並且FMX_PROCPTR是指向接受這兩個參數的函數的指針,並且 __stdcall 是某種調用約定(決定不深入研究這意味着什么)。

我不明白的是每行的結尾,即FMX_PROC(retType)FMX_PROCPT(retType, name)之后的部分。

可能是間距讓我感到困惑,但是retType __stdcallFMX_PROC(retType)的返回類型嗎? 還是給參數一個類型?

代碼中的其他地方FMX_PROC(retType)像這樣使用

static FMX_PROC(fmx::errcode) Do_FMmp_ConvertToBase( short /* funcId */, const fmx::ExprEnv& /* environment */, const fmx::DataVect& dataVect, fmx::Data& results )

宏沒有返回類型。 它們不是函數。 為了表達這種差異,這種宏被稱為“類函數宏”,即它們看起來像函數但它們不是函數。 預處理器將FMX_PROC(fmx::errcode)替換為fmx::errcode __stdcall 也就是說,這個:

static FMX_PROC(fmx::errcode) Do_FMmp_ConvertToBase( short /* funcId */, const fmx::ExprEnv& /* environment */, const fmx::DataVect& dataVect, fmx::Data& results )

擴展至此

static fmx::errcode __stdcall Do_FMmp_ConvertToBase( short /* funcId */, const fmx::ExprEnv& /* environment */, const fmx::DataVect& dataVect, fmx::Data& results )

它是一個函數聲明, fmx::errcode是它的返回類型。

這些宏只是為正在定義的函數或函數指針別名提供調用約定__stdcall

__stdcall是一種非標准編譯器內在函數,可確保使用此屬性記錄的函數將使用stdcall調用約定進行調用。 這適用於函數本身。

所以宏分別:

  • FMX_PROC擴展為retType __stdcall ,它為函數提供__stdcall 例如

    FMX_PROC(fmx::errcode) Do_FMmp_ConvertToBase(...)

    擴展為:

     fmx::errcode __stdcall Do_FMmp_ConvertToBase(...)
  • FMX_PROCPTR擴展為函數指針的typedef ,也記錄在__stdcall中。 這是必要的,因為函數指針通常不攜帶調用約定——因此編譯器不會隱式知道函數何時需要不同的調用約定。 要將標記為__stdcall的函數綁定到函數指針,函數指針本身必須攜帶此信息(這就是需要此別名的原因)。 這擴展為函數 typedef 的一部分:

     FMX_PROCPTR(fmx::errcode,Do_FMmp_ConvertToBase)(...);

    將擴展到

    typedef fmx::errcode(__stdcall *Do_FMmp_ConvertToBase)(...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM