簡體   English   中英

具有默認參數的宏包裝函數調用

[英]macro wrapping function call with default arguments

我有一個分配內存的函數,它有一個默認的對齊參數。

void* symalloc(int numbytes, int alignment=32)

我想從呼叫位置傳遞文件/行號。 所以,我將其更改為...

void* _symalloc(int numbytes, int alignment, const char* file, int line);
#define symalloc(numbytes, alignment) _symalloc(numbytes, alignment, __FILE__, __LINE)

但是現在的問題是,所有未按順序傳遞的呼叫者都被打斷了,其中有數百個。

是否可以通過某種方式使此支持或不通過對齊,並在兩種情況下都提供文件/行?

使用可變參數宏和__VA_ARGS__ (C ++ 11及更高版本,並且通常也受早期編譯器支持):

void symalloc_(const char* file, int line, int numbytes, int alignment=32);
#define symalloc(...) (symalloc(__FILE__, __LINE__, __VA_ARGS__))

請注意參數的重新排列,以便默認參數位於最后一個參數上。

您還需要為其他值設置默認參數,因此某些呼叫站點沒有默認值並不重要:

void* _symalloc(int numbytes, int alignment = 32, const char* file = NULL, int line = 0);

可能有一些預處理器魔術(由於此答案

真正的技巧是解決宏不能重載這一事實。 這些宏通過使用參數本身來在按位置選擇的另一個宏(用於選擇重載)的名稱周圍移動來工作。

請注意,默認值“ 32”出現在SYMALLOC1宏內。

#include <iostream>

void* symalloc_impl(int numbytes, int alignment, const char* file, int line){
    std::cout << file << ':' << line << "> symalloc(" << numbytes << ", " << alignment << ")\n";
    return nullptr;
}

#define SYMALLOC1(numbytes) symalloc_impl(numbytes, 32, __FILE__, __LINE__)
#define SYMALLOC2(numbytes, alignment) symalloc_impl(numbytes, alignment, __FILE__, __LINE__)
#define SYMALLOC_DISPATCH(_1,_2,NAME,...) NAME
#define symalloc(...) SYMALLOC_DISPATCH(__VA_ARGS__,SYMALLOC2,SYMALLOC1,UNUSED)(__VA_ARGS__)

int main() {

    symalloc(16);

    symalloc(64, 8);

    return 0;
}

輸出示例:

main.cpp:15> symalloc(16, 32)

main.cpp:17> symalloc(64, 8)

這里的例子

暫無
暫無

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

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