2011-08-24 636 views
0

嗨想創建一個具有兩個甚至三個參數的定義是可能的?#define可以有多個參數嗎?

#define my_define(param1,param2,param3)\ 
if (param1) \ 
{/*do something */} \ 
if (param2) \ 
{/*do something */} \ 
if (param3) \ 
{/*do something */} 
+2

您是否嘗試過?你發現了什麼問題? – Juliano

+0

是的,但是如果你希望這是一個真正的通用宏,你的宏體可以使用一些小工作。將'if's更改爲'else if',並在末尾添加'else;'。或者,也許更好的是,將所有內容都包含在'do {...} while(0)'中。 –

回答

2

是,#define宏的可以有一個以上的參數。

具體來說,C99指定一個兼容的實現必須能夠處理一個宏的至少127個參數(它曾經是C89中的31)。

+1

甚至可變數量的參數,與'的#define東西(...)something_else(__ VA_ARGS __)' – arnaud576875

+1

惱人的挑剔:C99 *是* ANSI C. ANSI發出的原始C標準在1989;國際標準化組織通過編輯性修改(例如重新編號),然後ANSI採用了1990年的ISO標準。該標準在1995年稍作修改.ISO於1999年頒佈了新標準,ANSI採用了該標準,取代了現在沒有官方標準的1990年標準。術語「ANSI C」通常用於指1989年或1990年的標準版本,但爲避免含糊不清,最好參考日期(C89/C90,C95,C99,C201X)。 (我告訴你這會很煩人!) –

+0

@凱斯:不煩人。調用C89/C90「ANSI C」只是一個難以忍受的習慣。 –

0

如果你想確定有多少參數傳遞給函數,你可以這樣做:

#include <stdarg.h> 

#define __VA_NARGS__(...) __VA_NARGS__N(__VA_ARGS__,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) 
#define __VA_NARGS__N(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,N,...) N 

#define sum(...) _sum (__VA_NARGS__(__VA_ARGS__), __VA_ARGS__) 
int _sum (numargs, ...) { 
    int total = 0; 
    va_list args; 

    va_start (args, numargs); 
    for (; numargs > 0; numargs--) { 
     total += va_arg (args, int); 
    } 
    va_end (args); 

    return (total); 
} 
相關問題