我正在嘗試制作一個宏,它將采用預定義的前綴并將其連接到宏引數中所需的函式名稱,但我沒有成功。
例如,雖然這是想要的函式簽名:
void somePrefix__someFunc(int a)
但是,當我運行它并檢查程式的符號表時,我最終得到了以下擴展:
FUNC_PREFIXsomeFunc
我做錯了什么,我該如何正確地做到這一點?
我試圖運行的代碼:
#include <iostream>
#define CONCAT(A, B) A##B
#define FUNC_PREFIX somePrefix__
#define FUNC_NAME(_func) CONCAT(FUNC_PREFIX, _func)
void FUNC_NAME(someFunc)(int a)
{
std::cout << a << std::endl;
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}
PS:我嘗試使用沒有 CONCAT 包裝器的宏(直接嘗試 concat FUNC_PREFIX##_func),但它仍然不起作用。
uj5u.com熱心網友回復:
##總是在宏“替換串列”被(重新)掃描之前應用,因此如果在CONCAT其他專案之前展開,我們將無法獲得所需的結果。每當我們##在宏替換期間在替換串列中結束時,它就會在任何進一步替換之前應用。
所以你需要一個額外的輔助宏來擴展FUNC_PREFIX,使其在擴展之前CONCAT是:
#include <stdio.h>
#define CONCAT(A, B) A##B
#define CONCAT_EXPAND(A, B) CONCAT(A,B)
#define FUNC_PREFIX somePrefix_
#define FUNC_NAME(func) CONCAT_EXPAND(FUNC_PREFIX, func)
void FUNC_NAME(someFunc)(int a)
{
printf("%s: %d\n",__func__, a);
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}
輸出:
somePrefix_someFunc: 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456463.html
