PDA

View Full Version : Preprocessor Directives



ebnsina
سه شنبه 28 آبان 1387, 15:26 عصر
با سلام خدمت دوستان

من از Preprocessor Directives در C# برای مدیریت امکانات و نسخه های مختلف مشتریانم استفاده می کنم اما متاسفانه تا این زمان مطلبی مفید در این زمینه در هیچ جایی پیدا نکردم. :متعجب::گریه:

سئوالم اینه :

چگونه تمام تعاریف Preprocessor Directives را در یک فایل داشته باشیم و در تمام فایل های سورس فقط این فایل را معرفی کنیم و مجبور نباشیم در هر سورسی تعاریف Preprocessor Directives را تکرار کنیم ؟!
(مثل include فایل ها در C و Delphi) :گیج:


پروژه مثالی هم در دو پاسخ پایینتر پیوست کردم.


خواهش می کنم کمک کنید چون هربار و در هر سورس فایلی مجبورم این تعاریف (define) را تکرار کنم. :تشویق:

Mehdi Asgari
سه شنبه 28 آبان 1387, 17:21 عصر
سوالتون رو همراه با یه مثال (یا اگه ممکنه قطعه کد) بپرسید. من که متوجه سوالتون نشدم.
در ضمن C# Specification (http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/csharp%20language%20specification.doc) مفصل در این باره صحبت کرده (صص 45 تا 54)
http://msdn.microsoft.com/en-us/library/ed8yd1ha(vs.71).aspx

ebnsina
سه شنبه 28 آبان 1387, 18:38 عصر
از توجه شما ممنونم، اما مباحث آموزشی زیاده. هم در MSDN و هم در کتابها.

اما همه به این اشاره دارند که چگونه می تونیم از دستورات Directives در برنامه نویسی استفاده کنیم. البته در یک فایل سورس.

این هم یک پروژه مثالی که در واقع خیلی موضوع سنگین تر است.

توجه کنید که define مربوط به IsMultiply در ابتدای کلاس های Class1 و Class2 در هر دو کلاس اجباراً تعریف شده است تا در این کلاس ها تاثیر کند.

دوباره می پرسم :

چگونه می توان فقط یک بار آنهم در یک فایل (مثلا include file) این define را تعریف کرد و فقط در Class1 و Class2 نام فایل include را برد تا این define در هر دو معنی پیدا کند و تاثیر بگذارد.


از دوستان حرفه ای تقاضای عاجزانه دارم، عنایتی کرده و جواب بدهند.

لطفا دوستان حرفه اي كمك كنند چون براي همه دوستان حرفه اي و پروژه هاي بزرگ بسيار نياز است.

ebnsina
چهارشنبه 29 آبان 1387, 19:59 عصر
لطفا دوستان حرفه اي كمك كنند چون براي همه دوستان حرفه اي و پروژه هاي بزرگ بسيار نياز است.

linux
چهارشنبه 29 آبان 1387, 20:42 عصر
لطفا دوستان حرفه اي كمك كنند چون براي همه دوستان حرفه اي و پروژه هاي بزرگ بسيار نياز است.
کاربردی که شما انتظار دارید ، با این دایرکتو ها بدست نمی آید

The #define directive cannot be used to declare constant values as is typically done in C and C++. Constants in C# are best defined as static members of a class or struct. If you have several such constants, consider creating a separate "Constants" class to hold them.

ebnsina
پنج شنبه 30 آبان 1387, 11:13 صبح
کاربردی که شما انتظار دارید ، با این دایرکتو ها بدست نمی آید

The #define directive cannot be used to declare constant values as is typically done in C and C++. Constants in C# are best defined as static members of a class or struct. If you have several such constants, consider creating a separate "Constants" class to hold them.



دوست عزيز ضمن تشكر از راهنمايي خوب شما ، مي خواستم بدونم كه متن انگليسي نوشته شده را از كجا نقل كرديد ؟

علیرضا مداح
پنج شنبه 30 آبان 1387, 11:33 صبح
سلام دوست عزیز،


دوست عزيز ضمن تشكر از راهنمايي خوب شما ، مي خواستم بدونم كه متن انگليسي نوشته شده را از كجا نقل كرديد ؟


MSDN - #define (C# Reference) (http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx)

ebnsina
پنج شنبه 30 آبان 1387, 11:35 صبح
کاربردی که شما انتظار دارید ، با این دایرکتو ها بدست نمی آید

The #define directive cannot be used to declare constant values as is typically done in C and C++. Constants in C# are best defined as static members of a class or struct. If you have several such constants, consider creating a separate "Constants" class to hold them.



توجه داشته باشيد كه در حالتي كه شما ذكر كرديد در واقع خطوط برنامه اي كه وابسته به شرط هاي داخل كلاس Constraints هستند كامپايل مي شوند ولي بر اساس صحيح نبودن شرط اجرا نمي شوند.

در حالي كه با استفاده از Directive ها خطوطي كه وابسته به يك Define هستند و شرط صحيح ندارند اصلا كامپايل نمي شوند و اساسا در فايل اجرايي وجود ندارند.

همه نكته استفاده من از Directive ها اين است كه به علت كمبود امنيت در .Net ، سعي ميكنم تا با استفاده از Directive ها اساسا در نسخه هاي مشخص امكاناتي خذف شود تا موارد مفيد زير خاصل شود :
1- حجم فايل و سرعت بهبود يابد.
2-بطور اساسي امكانات حذف شده در فايل اجرايي موجود نيست كه حتي Cracker با يك تغيير كوچك بتواند آنها را فعال كند و به نسخه با امكانات تري دست يابد.
3- و كنترل نسخه ها همچنان آسان تر است.
4- و ...

دوستان حرفه اي كمك !!!!! بفرمايـــــــــــــــــــ ـــــيـــــــــــــــــــ ـــــــــــــــــــــد !!!!!!!!!

ebnsina
شنبه 02 آذر 1387, 16:58 عصر
يعني دوستان با سابقه به اين مشكل نخورده اند ؟
و يا راه حل ديگري بجاي استفاده از Directives ها سراغ دران ؟ :متعجب:

اگر هم واقعا در C# چنين امكاني وجود نداره دوستان بگن تا يك متن مناسب براي ارائه به كميسيون استاندارد اروپا و Microsoft تهيه كنيم و به اين موضوع جامونده در C# اشاره كنيم !! :گیج:


خواهشا نظر صريحتون رو بفرماييد چون من خيلي وقته كه به اين مشكل دچارم.
:گریه:

mehdi.mousavi
شنبه 02 آذر 1387, 17:20 عصر
يعني دوستان با سابقه به اين مشكل نخورده اند ؟ و يا راه حل ديگري بجاي استفاده از Directives ها سراغ دران ؟ :متعجب: اگر هم واقعا در C# چنين امكاني وجود نداره دوستان بگن تا يك متن مناسب براي ارائه به كميسيون استاندارد اروپا و Microsoft تهيه كنيم و به اين موضوع جامونده در C# اشاره كنيم !! :گیج: خواهشا نظر صريحتون رو بفرماييد چون من خيلي وقته كه به اين مشكل دچارم.
:گریه:

سلام.
معلومه که وجود داره! شما برای اینکار 2 راه دارید:

1. یا بالای هر فایل Directive ای رو که میخواهید تعریف کنید که در اینصورت این تعریف فقط روی اون فایل اعمال میشه. (که شما اینو نمی خواهید)!

2. در پنجره Properties پروژه، قسمت General، یه TextBox هست تحت عنوان Conditional compilation symbols. باید در این قسمت، نام Directive مورد نظرتون رو بنویسید، مثلا IsMultiply. به این ترتیب Visual Studio با استفاده از /define switch تعریف Directive مورد نظر رو به همه فایلهای پروژه اعمال میکنه. (این روشی هستش که شما بدنبالشید). ضمنا، اگر خواستید چند تا Directive رو با هم تعریف کنید، کافیه تا با ; اونها رو از هم جدا کنید.