برگزیده های پرشین تولز

تابع با پارامترهای اختیاری

pirmard

Registered User
تاریخ عضویت
21 آگوست 2007
نوشته‌ها
841
لایک‌ها
5
سلام
اقا 1 روزه ما علافه 2 خط کد از یه برنامه شدیم !
جریان اینه که یه تابع داره این برنامه که پارامتر اختیاری می گیره . بعد حالا کامپایلر گیر داده به دیفاین تابع !
از طرف دیگه از این پارامترهای اختیاری هم نمیشه استفاده کرد .

#define myfunc(xxx, yyy, zzz, mmm , ...)
ببینین ته تابع 3 تا نقطه گذاشته شده که یعنی بعدش بتونه پارامتر اختیاری بیاد . حالا اینجوری ایراد می گیره :
f

(54) : error C2010: '.' : unexpected in macro formal parameter list
(54) : error C2010: '.' : unexpected in macro formal parameter list
(54) : error C2010: '.' : unexpected in macro formal parameter list
(54) : error C2010: ')' : unexpected in macro formal parameter list​

یعنی کامپایلر به خط 54 که میرسه به 3 نقطه و پرانتز گیر داده که یعنی نمی فهمه اونا چین :wacko:

حالا باز توی همین تابع خط بعدی اومده از __va_arg__ استفاده کنه . به اون هم گیر میده !!!!

res = newfunc(text, __VA_ARGS__)​

خط بالا که ایراد نداره . اما کامپایلر میگه :

c(58) : error C2065: '__VA_ARGS__' : undeclared identifier​

علت چیه ؟
با وجود اینکه کتابونه ی stdarg هم ادد شده اول برنامه .

کسی از اساتید می دونه چشه این ؟

compiler : visual c++ 6.0
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
دوست عزیز define تابع تعریف نمی کنه بلکه یه ماکرو می سازه ماکروها اصلا قدرت تابع ها رو ندارن پس نمی تونن مثل اونا پارمتر های اختیاری یا پارامتر متغییر داشته باشن بهتره یه تابع دریت تعریف کنید در مورد پارامتر های اختیاری هم تاجایی که ممکنه از ... استفاده نکنید و از مقدار های اپشنال به جاش استفاده کنید چون با استفاده از ... نیاز به مدیریت بالای داره که در صورت عدم رعایتش نظم استک رو بهم می ریزید مشکلات عجیب قریبی براتون پیش می یاد و دوم اینکه ... همه کنترل تایپ ها رو دور می ریزه و کاربر می تونه به جای اینت دابل بفرسته و ...
 

pirmard

Registered User
تاریخ عضویت
21 آگوست 2007
نوشته‌ها
841
لایک‌ها
5
دوست عزیز define تابع تعریف نمی کنه بلکه یه ماکرو می سازه ماکروها اصلا قدرت تابع ها رو ندارن پس نمی تونن مثل اونا پارمتر های اختیاری یا پارامتر متغییر داشته باشن بهتره یه تابع دریت تعریف کنید در مورد پارامتر های اختیاری هم تاجایی که ممکنه از ... استفاده نکنید و از مقدار های اپشنال به جاش استفاده کنید چون با استفاده از ... نیاز به مدیریت بالای داره که در صورت عدم رعایتش نظم استک رو بهم می ریزید مشکلات عجیب قریبی براتون پیش می یاد و دوم اینکه ... همه کنترل تایپ ها رو دور می ریزه و کاربر می تونه به جای اینت دابل بفرسته و ...

ممنون عزیز

اما خوب این ماکرو تعریف شده و توی برنامه ی پدرمادر داری استفاده شده . خودم ننوشتم و اطمینان دارم چندین هزار نفر این سورس رو استفاده کردن و باگ ریپورت نکرده بودن این مورد رو .
الان دستم باز نیست که نحوه ی ارسال پارامتر رو تغییر بدم وگرنه 1000 جای دیگه که فراخونی داریم باید برم تغییر بدم :( که کار درستی نیست .
الان این چیزی که بالا نوشتم پس به نظر شما مشکل داره واقعا ؟
 
بالا