שאלה על התחביר של VC++

erezsh

New member
שאלה על התחביר של VC++

לאחרונה התחלתי להשתמש ב-VC++ (ברגשות מאוד מעורבים
) בכל מקרה, כשניסיתי ליצור פונקציית Inline, גיליתי שהתחביר הבא:
inline int f(int n);​
אינו חוקי.. לאחר ניסיונות מאבק רבים, הבנתי שהדרך היחידה היא להצהיר על הפונקציה ולהכניס שם את ה-inline . אבל עוד יותר חמור, חייבים לשים סוגריים מסביב להצהרת הפונקציה עליה עושים inline.. הבעיה היא - שזה מאוד מוזר, ועוד יותר חמור - gcc לא יקבל כזה דבר, והקוד שלי לא יהיה portable. מישהו יכול להציע פתרון?
 

ronitV

New member
למה אתה מתכוון ב../images/Emo12.gif

סוגריים מסביב להצהרת הפונקציה עליה עושים inline וגם איזה סוגריים בדיוק לא ברור.
 

erezsh

New member
אני מתכוון

שהוא מקבל רק:
inline ( int f( int x) );​
כלומר, נותן שגיאה אם אין סוגריים..
 

ronitV

New member
../images/Emo12.gif מוזר כי

הקוד בקוד הבא אין בעייה
class A { public: inline int f(int n); inline int g(int n) { return 0; } }; inline int A::f(int n) // also - int A::f(int n) - is OK { return 0; }; int main() { A a; a.f(1); a.g(1); return 0; }​
או שלא הבנתי את הבעייה שלך.
 

erezsh

New member
אולי.

אני לא בדקתי את זה בתוך Classes, כי אני כותב ב-C.
 

annefan

New member
תזהר!

לפי כל מיני דברים שכבר ראיתי, VC, גם 2003, הוא לא קומפיילר C99 סטנדרטי, רק ++C (ושם הוא מאוד סטנדרטי). inline היא מילה שהוספה ל-C99 בלבד, לא ב-C90, ולכן בקונטקסט של C, הוא מתייחס ל-inline כאל שם משתנה, ולא כמילה שמורה!! זאת אומרת שהקוד שלך מתקמפל, אבל כמעט בטוח שהוא לא עושה מה שאתה חושב שהוא עושה. מה לעשות? א. קח בחשבון שרוב הקומפיילרים, מתעלמים מרוב ה-inline של המתכנתים, שהוא רק המלצה. הקומפיילרים והאופטימייזרים היום יודעים טוב מאוד (וכמעט תמיד יותר טוב ממך) אלו פונקציות להכניס כמות שהן. ב. ל-MS יש מילים שמורות inline_ (רק ב-VC6, זהה ל-inline__ ב-2003) ו-inline__, כדי לתת inline גם ב-C כהרחבה לשפה. (יש גם forceinline__ שעושה inline בכל מקרה, גם אם לא כדאי (כשאתה ממש ממש משוכנע שאתה יודע מה אתה עושה). אם אתה רוצה לשמור על פורטביליות, אתה יכול לכתוב משהו כזה:
#if (defined _MSC_VER) && !(defined __cplusplus) #define inline __inline #endif​
כלומר, אם מוגדר MSC_VER_ (קומפיילר של MS), ולא מוגדר __cplusplus (כלומר, הקוד מקומפל כ-C ולא ב-++C), אתה מגדיר את inline כ-inline__ ומכאן והלאה הכל אותו דבר. מקווה שזה בסדר.
 
למעלה