2016-03-04 69 views
-1

我試圖做類似如下:「重載」宏以`#define`恆

//Bad; can't redefine macros; uses later definition. 
#define foo   ) 
#define foo(arg) ,arg) 

也就是說,我想foo(注:宏功能)映射到一件事情,我想宏功能foo(arg)映射到其他東西。所以foo需要一些#define常數(捕獲兩種情況)映射到。 。 。一些東西。


我一直沒能想出一個辦法,(而且由於這是一個宏觀的和恆定的,許多previousquestions不適用)。 我該怎麼做?

邪惡的編譯器/平臺特定選項也很棒。雖然我使用的是C++ 14,但爲C宏標記


旁註(按要求):這可以用於例如,製作爲new自己的調試重載將與安置工作的新和:

#define new new(__FILE__,__LINE__ foo 
//... 
void const* p1 = new  int(); 
void const* p2 = new (ptr) int(); 
+2

你能描述一個這樣的要求的原因嗎? –

+0

你能再描述一下這個需求嗎?我似乎明白你在問什麼,但並不完全明白你說的「)」和「,arg)」是你問題的一部分。 – tofro

+0

@EugeneSh。如果沒有老鼠洞,這很難,但我添加了一個簡短的例子。 – imallett

回答

1

你似乎在尋找有不同的名字空間的功能預處理器 - (帶參數)和對象樣(普通的#defines)宏 - 我不知道任何會有這種情況的,如果有,我會假設它會根本混淆。

我明白你想要的東西像(注意,這實際上是不是想提供一個解決方案)

// NOTE: Example might work in some very trivial use cases 
#ifdef DEBUG 
#define new(x) new(x);lognew(__FILE__,__LINE__) 
#define pnew(p,x) new (p) (x); lognew(__FILE__,__LINE__) 
#else 
#define new(x) new(x) 
#define pnew(p,x) new(p) (x) 
#endif 

而且PNEW和新應使用相同的關鍵字。不,我不認爲這是可能的(我很高興它不是;))。

+0

當前接受這個答案,因爲它聲稱這是不可能的。這也是我的結論。如果有人想出辦法,我會接受。 – imallett

-1

帶有可變簽名的函數只允許在C++中被稱爲「函數重載」。