2012-09-21 49 views
2

我有下面的代碼,有人在MSVC的工作已經給我:使用MSVC預處理「charizing」運營商鏘

#define MAP1(x, y) map[#x] = #@y; 

我在Xcode中,使用鏘,並從不同的谷歌搜索我發現這被稱爲'charizing操作符',並且特定於MSVC的預處理器。在使用Clang時是否有模擬此操作員功能的方法?我試圖消除@,但有以下錯誤信息:

Assigning to 'int' from incompatible type 'const char[2]' 

會顯式類型轉換到「廉政」的工作或者是charizing運營商做不同的東西?

+0

'(#y [0])''? – Necrolis

回答

4

的字符串化操作(標準C++)轉換成a"a",所以操作者charizing聽起來像它原來a'a'。在簡單的情況下,你可以通過取第一個字符從"a"得到'a'

#define MAP1(x, y) map[#x] = static_cast<const char(&)[2]>(#y)[0]; 

static_castconst char(&)[2]保證,如果你沒有得到長度爲1,這是兩個字符,如果算上尾隨'\0'的字符串你得到一個編譯時錯誤。無論字符串的長度如何,普通的#y[0]都會默默接受第一個字符。

+0

謝謝 - 爲了保持與MSVC的行爲一致,你知道如果給定比一個字符長的字符串,MSVC的charomat操作符會拋出一個錯誤嗎? – benwad

+0

@benwad我不知道,但如果不知道,你可能會得到(例如)''ab'',這與''ab「[0]'非常不同,這會使它與VC的'#@'完全相同的行爲非常複雜。 – hvd

+0

爲了記錄,MSVC *將* charize多個字符的序列。注意,在C和C++中允許具有多個字符的字符常量,但是具有實現定義的值,並且類型爲「int」,而不是「char」(在兩種語言中)。 – Leushenko

2

你試過類似#y [0]的東西嗎?基本上,「stringify y並採取第一個字符」:-)

除此之外,因爲從它的外觀生成的語句是在運行時無論如何執行,你可以將字符串y,傳遞給一個函數,並有該函數返回正確的東西。