PDA

View Full Version : سوال: سوال در رابطه با چند مورد syntax در C++



Aghaeifar
چهارشنبه 18 آذر 1394, 14:23 عصر
سلام

یه کدی رو دارم می خونم که یه نفر دیگه نوشته. بعضی از خط هاش رو نمی تونم با چیزی که از C++ می دونستم تطبیق بدم و معنی کنم. ممنون میشم اگر کسی خلاصه وار بهم یه سرنخی بده یا لینک مفیدی در این زمینه.

۱- در تعریف یه تابع در یک هدر فایل نوشته شده

extern char* tf_ma(const char* szFormat, ...);
معنی ... به عنوان آرگومان یه تابع چی هست؟

۲-یه هدر فایل دیگه است که در بالای هدر فایل نوشته
class txtOutput;
بعد پایین تر هم در تعریف یه تابع نوشته:
extern bool output(txtOutput* pOut);
متوجه این نوع تعریف کلاس از txtOutput نمیشم. اینکه این کلاس شامل چه متدهایی هست نباید حداقل ذکر می شد و بعدا بدنه ی متد ها رو در فایل cpp دیگری نوشته می شد؟ هیچ چیزی از کلاس txtOutput مشخص نیست.

۳- در تعریف یک تابع دیگه آورده شده:
#define LIB__FUNCTION __attribute__ ((visibility("default")))
extern LIB__FUNCTION bool Input(const char* szLine);


معنی عبارتی مثل
__attribute__ ((visibility("default")))
قبل از تعریف اسم تابع چیه؟ قبلا با چیزهایی مثل inline آشنا بودم اما همچین موردی کاملا برام تازگی داشت.


ممنون میشم اگر دوستان بتونند در هر مورد که میسر بودند کمی مسئله رو برای من روشن کنند.

rahnema1
چهارشنبه 18 آذر 1394, 18:14 عصر
سلام
1. این ... یا ellipsis برای تعریف تابعهایی به کار می ره که تعداد نامشخص می تونند آرگومان دریافت کنند مثل تابع printf
2. برای اینکه ما بتونیم از یک نام در برنامه استفاده کنیم باید از قبل اون نام را «تعریف» یا «اعلان» کرده باشیم
اما وقتی می خواهیم از اشاره گر به یک نام استفاده کنیم کافیه فقط «اعلان» کنیم
در اینجا کلاسی به نام txtOutput وجود داره که می خواهیم از اون استفاده کنیم اما چون داریم از اشاره گر به اون استفاده کنیم فقط کافیه نام اون را اعلان کنیم و لازم نیست کلاس را کاملا تعریف کنیم تا برنامه بتونه کامپایل بشه
اینجا (http://barnamenevis.org/showthread.php?493157) توضیحات بیشتر می تونید مطالعه کنید
attribute ها هم یه سری امکانات هست که هر کامپایلر می تونه برای کد هایی که نوشته می شه تعریف کنه ولی جزء استاندارد ++c نیست مثلا این __attribute__ مخصوص کامپایلر gcc هست و تو کامپایلر ویژوال استادیو قابل استفاده نیست ( خودش یه سری attribute برای این کار داره)
وقتی که یک فایل اجرایی مثل dll یا so ایجاد می شه می تونیم کاری کنیم نام بعضی تابعها و بعضی سمبولهای دیگه را مخفی و نام بعضی دیگه را قابل رویت کنیم تا برنامه های دیگه با استفاده از اون نامها بتونند مثلا از اون dll استفاده کنند
حالا __attribute__ ((visibility("default"))) پشت تعریف تابع می ذاریم یعنی این تابع قابل رویت باید باشه بعد هم موقع کامپایل دستور fvisibility=hidden را می زنیم تا تمام سمبولها به جز اونهایی که مشخص کردیم مخفی بشن
توضیحات بیشتر را می تونید در اینجا (https://gcc.gnu.org/wiki/Visibility) مطالعه کنید

Aghaeifar
چهارشنبه 18 آذر 1394, 18:28 عصر
سلام
1. این ... یا ellipsis برای تعریف تابعهایی به کار می ره که تعداد نامشخص می تونند آرگومان دریافت کنند مثل تابع printf
2. برای اینکه ما بتونیم از یک نام در برنامه استفاده کنیم باید از قبل اون نام را «تعریف» یا «اعلان» کرده باشیم
اما وقتی می خواهیم از اشاره گر به یک نام استفاده کنیم کافیه فقط «اعلان» کنیم
در اینجا کلاسی به نام txtOutput وجود داره که می خواهیم از اون استفاده کنیم اما چون داریم از اشاره گر به اون استفاده کنیم فقط کافیه نام اون را اعلان کنیم و لازم نیست کلاس را کاملا تعریف کنیم تا برنامه بتونه کامپایل بشه
اینجا (http://barnamenevis.org/showthread.php?493157) توضیحات بیشتر می تونید مطالعه کنید
attribute ها هم یه سری امکانات هست که هر کامپایلر می تونه برای کد هایی که نوشته می شه تعریف کنه ولی جزء استاندارد ++c نیست مثلا این __attribute__ مخصوص کامپایلر gcc هست و تو کامپایلر ویژوال استادیو قابل استفاده نیست ( خودش یه سری attribute برای این کار داره)
وقتی که یک فایل اجرایی مثل dll یا so ایجاد می شه می تونیم کاری کنیم نام بعضی تابعها و بعضی سمبولهای دیگه را مخفی و نام بعضی دیگه را قابل رویت کنیم تا برنامه های دیگه با استفاده از اون نامها بتونند مثلا از اون dll استفاده کنند
حالا __attribute__ ((visibility("default"))) پشت تعریف تابع می ذاریم یعنی این تابع قابل رویت باید باشه بعد هم موقع کامپایل دستور fvisibility=hidden را می زنیم تا تمام سمبولها به جز اونهایی که مشخص کردیم مخفی بشن
توضیحات بیشتر را می تونید در اینجا (https://gcc.gnu.org/wiki/Visibility) مطالعه کنید

خیلی ممنون
توضیحتون کاملا روشنم کردم. و همچنین در اون لینکی که دادید هم بسیار خوب توضیح دادید.
سپاسگزارم.