2013-06-25 81 views
0

我遇到了一個問題,我需要能夠通過宏修改C函數調用。帶宏的前綴函數調用

的基本結構是這樣的:

#define foo bar 
foo_1(x); 
foo_2(x); 
foo_3(x); 

我要的是

bar_1(x); 
bar_2(x); 
bar_3(x); 

被調用,但是字符串宏似乎並沒有更換電話的前綴部分。

有人能指出我正確的方向嗎?

+3

那麼,預處理器的工作標記,而不是文本片段。 'foo_1'是一個單一的標記。 –

+0

這會解釋它!以爲這是一個發現/替換的例子。謝謝。 – xceph

回答

2

宏只適用於全令牌(感謝上帝 - 他們夠糟糕的是)。換句話說,#define foo bar僅影響識別的foo,而不是識別碼foo_1,因爲這不是同一個標記。

如果你不能修改調用代碼,就沒有辦法達到你想要的。使用文本編輯器的搜索&替換或類似的東西。

如果你真的想要的是一個函數調用代碼片段根據需要,可以調整到不同的名稱前綴,你可以寫這樣的:

foo(1)(x); 
foo(2)(x); 
foo(3)(x); 

,你有這個片段之前,您定義像這樣:

#define foo(i) bar_ ## i 
+0

謝謝,這是我擔心的:)希望通過這種解決方案節省一些時間,看起來像病毒只是跳到最後的,適當的實施。 – xceph

+0

根據我的經驗,您永遠無法節省執行預處理技巧的時間。 – Art

1

使用string concatenation

➤ cat try.h 
#define mymacro(msv) bar_##msv 
mymacro(1)(x); 
➤ gcc -E try.h 
# 1 "try.h" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "try.h" 

bar_1(x); 
+0

即將指出舊代碼無效,但您修復了它。 –

+0

謝謝,但代碼太廣泛,以便像這樣的調用包裝所有東西。希望這將是一個快速解決方案,看起來我只是跳到fina解決方案。 – xceph