מקרואים

gilad_no

New member
מקרואים

יש לי פונקציה:
Log(int x,int y,int nCode,const char *szText,...);​
ואני רוצה להגדיר לה מקרו שייכתבו כך:
LOG(nCode,"Hello %s","World");​
ניסיתי להגדיר
#define LOG(x,y) Log(1,2,x,y)​
אבל כמו שאפשר לנחש זה יעבוד רק לפרמטר הראשון. יש למישהו רעיונות? ניסיתי גם לעטוף את כל המחרוזות בסוגריים אבל זה גם לא עוזר
 

jgut

New member
בדרך כלל כשיש צורך במקראים ל-log

אני משתמשת במשהו שניראה יותר כך:
char buffer[256]; void Log(int x,int y, const char *szText,...) { printf(szText); } #define LOG(Text) {sprintf Text;Log(1,2,buffer);} int main(int argc, char* argv[]) { LOG((buffer, "Hello %s","World")); return 0; }​
אני לא יודעת אם זה פותר לך את הבעיה אבל זו דרך.
 

gilad_no

New member
לא בדיוק,

אני לא רוצה לכתוב מקרו שמבצע PRINTF. בשביל זה יש לי את הפונקציה. אני צריך דרך להעביר מספר לא ידוע של פרמטרים ממקרו לפונקציה
 

ihovav

New member
אולי תנסה...

להשתמש בשיטה של ה ARGC\ARGV - כלומר תשתמש ב CHAR** ובפרמטר שמכיל את מספר השורות במערך - ככה תוכל להעביר כמות בלתי מוגבלת של מחרוזות ללא בעיה דרך אגב - איך הלך ? התקשרתם ?
 

חובבן

New member
יש שתי שיטות (שאני מכיר)

הנה אחת:
#define TRACE(_level, ...) { printf("%s, %d, %d: ", __FILE__, __LINE__, _level); printf(__VA_ARGS__); printf("\n"); }​
ועוד אחת:
#define TRACE(_level,args, ...) write(__FILE__,__LINE__,intl,args) void write(const char* _sourceFileName, const int& _lineNumber, const int& _level ...) { va_list ap; va_start(ap, _level); char* format = va_arg(ap,char*); char msg[4096]; vsprintf(msg,format,ap); cout << _level << " " << levelName(_level) << "; " << msg << "; FILE: " << _sourceFileName << "; LINE: " << _lineNumber << endl; va_end(ap); }​
צפה להתנהגות משתנה בין קומפיילרים !!!
 

gilad_no

New member
גם לא,

2 השיטות לא עובדות. הוא לא מקבל 3 נקודות במקרו
 

חובבן

New member
תיארתי לעצמי../images/Emo10.gif

VC מפגר בהרבה תחומים אחרי הסטנדרט. שתי הדוגמאות שהבאתי עובדות עם קומפיילרים אחרים. אני יכול רק להפנות אותך ל GNU GCC
 
למעלה