我有很多行代碼像下面的參數列表:C代碼宏:如何使用宏來產生的另一個宏
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
爲他們每個人,我希望能夠提取(I- 0)並將其傳遞給另一個函數。像:
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
my_test_func(i-0);
,所以我寫了兩個宏:
#define GET_VERT(_x, _y, _z) get_vert(_x, _y, _z) , _y
#define SP_SETUP_POINT(_x, _y, _z) sp_setup_point(_x, _y); my_test_func(_z);
,並呼籲他們喜歡:
SP_SETUP_POINT(setup, GET_VERT(vertex_buffer, i-0, stride));
但是,它並沒有給我想要的東西,它擴展爲:
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride), i-0); my_test_func();
和MSVC編譯器抱怨
not enough actual parameters for macro 'SP_SETUP_POINT'
我搜索相當多,根據https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
宏參數是完全宏擴展它們代入宏體之前,除非它們是字符串化或與其他標記粘貼。替換之後,將再次掃描整個宏體(包括替換參數)以擴展宏。結果是參數被掃描兩次以擴展其中的宏調用
參數已完全展開,但附加參數未被識別。那是怎麼回事?任何建議表示讚賞。
提示:使用您的編譯器選項來發出預處理的源代碼,以查看錶達式的計算結果。 – doynax
是的,我試過了。我經過預處理後得到了代碼,但仍不知道如何獲得所需的宏擴展。 – luckyyang