2014-09-25 24 views
0

我想在模塊範圍內反覆實例化一個類,而不提供唯一的名稱。像這樣的東西。不使用標識符的重複類實例化

MyClass name##__LINE__(); // doesn't work because __LINE__ won't stringify 
MyClass name##__LINE__(); // duplicate identifier error - two name__LINE__ variables 

是否有某種方式來做到這一點,無論是創造一個獨特的名字或使用一些匿名的情況下,如一個初始化或結構?

+0

是'MyClass的ARR [N]'的選項? – 2014-09-26 00:05:46

+0

[C/C++宏/模板blackmagic生成唯一名稱]的可能重複(http://stackoverflow.com/questions/2419650/cc-macro-template-blackmagic-to-generate-unique-name) – 2014-09-26 00:22:35

回答

1

this answer

#define CONCATENATE_DETAIL(x, y) x##y 
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y) 
#define MAKE_UNIQUE(x) CONCATENATE(x, __LINE__) 

MyClass MAKE_UNIQUE(name); 
MyClass MAKE_UNIQUE(name); 
... 

或者只是做一個數組:

MyClass arr[N]; 

爲什麼這些宏工作
C11標準,6.10.3.1 Argument substitution

的論據日以後e函數類似的宏的調用已​​經被識別,參數替換髮生了 。在替換列表中的參數,除非由###預處理記號預處理記號或後跟一個##(見下文),是 通過包含在其中的所有的宏之後的相應參數代替前面 已經 擴大。在被替換之前,每個參數的預處理標記是 完全宏替換,就好像它們構成了預處理文件的其餘部分一樣;沒有其他 預處理令牌可用。

C++標準中的相應段落(16.3.1 Argument substitution)是C標準的精確副本。

+0

任何人都可以驗證這個解決方案符合標準嗎?我可以期望它可以與所有符合實現的工作一起使用嗎? – BSalita 2014-09-26 14:22:39

+0

@BSalita看到我的更新 – 2014-09-26 15:22:00

+0

夢幻般的答案。謝謝! – BSalita 2014-09-27 14:05:15

0

您需要仔細窩連接操作

struct A{}; 

#define JOIN(X, Y) JOIN_DETAIL(X, Y) 
#define JOIN_DETAIL(X, Y) JOIN_DETAIL2(X, Y) 
#define JOIN_DETAIL2(X, Y) X##Y 

int main() { 
    A JOIN(a, __LINE__); 
    A JOIN(a, __LINE__); 
}