2010-08-03 64 views
25

在一個C宏中,是否可以利用粘貼的令牌?例如,我現在有下面的宏:您可以在宏中使用粘貼的令牌嗎?

#define TEST(name, keyword) \ 
    test_##name: 
     TEST_##keyword##_KEYWORD 

我將調用此如下:

TEST(test1, TEST1) 

這將產生以下:

test_test1: 
    TEST_TEST1_KEYWORD 

現在,而不必鍵入相同的名稱兩次(一次使用所有小寫字符,再次使用所有大寫字符),是否有任何方法可以執行以下任一操作,並將令牌更改爲全部大寫l etters或全部小寫字母?

TEST(test1) or TEST(TEST1) 

感謝, 瑞安

+0

我已經看到了非常大的老代碼重複很多單詞在小寫和大寫達到你想要的東西。我從中猜測這是不可能的。 – 2016-04-05 12:04:27

回答

8

據我所知,可對令牌在C預處理器來完成(至少ISO/ANSI標準)唯一的操作就是更換,「字符串化'或連接它們。我也不知道任何GCC或MSVC擴展,可以讓你做你想做的。但是,人們一直在用巧妙的(或古怪的)方式來用宏來做神奇的(或可怕的)事情,所以如果有人讓我驚訝,我不會感到驚訝。

+0

謝謝,邁克爾。這幾乎是我期待的,但我希望有人能讓我感到驚訝。 =) – DuneBug 2010-08-03 20:38:18

7

你可以做類似如下(未經測試,可能錯別字......)

#define NORMALIZE(TOK) NORMALIZE_ ## TOK 

,然後爲每個作品的,可能會出現不

#define NORMALIZE_test1 test1 
#define NORMALIZE_TEST1 test1 

然後使用NORMALIZE宏裏面你的真實宏像

#define TEST(name, keyword)     \ 
    test_ ## NORMALIZE(name):     \ 
     TEST_ ## NORMALIZE(keyword) ##_KEYWORD 

(但也許你必須做一些中間助手宏,直到你 得到所有連接權)

+0

哈!哈!你做錯了...他希望'TEST(name)'這樣你就可以擁有'#define NORMALIZE_TEST1_UPPER TEST1',然後'#define NORMALIZE_TEST1_LOWER test1',然後使用TEST和大寫版本'TEST(TEST1)'。 (你當然可以用小寫字母來做同樣的事情,取決於你想如何調用你的'TEST()'宏。) – 2014-08-17 03:28:38

1

這是不可能的,因爲預處理器在輸入流pp-token上工作,並且沒有允許您以有意義的方式分解這些數據的結構。

什麼預處理器是構建與宏展開來代替pp-token S,將它們連接起來,將其刪除(完全)等

這意味着你的uppercasing唯一的希望是先從單個字符和大寫這些和然後把所有東西粘在一起將個別字符大寫非常簡單,因爲您只能使用有限的集合。另一方面將它們膠合在一起是可能的,至少如果你將自己限制在固定的最大長度。你會在想這可以使用微距端可達:

TEST(t,e,s,t,1)