PDA

View Full Version : windows.h



1010011010
شنبه 14 دی 1392, 20:33 عصر
سوال اول: تو زبان سی متناظر با هر فایل هدر باید یک فایل هم نام سورس سی یا اقلا کامپایل شده اون وجود داشته باشه، درسته؟؟؟
فایل windows.c (!) یا اقلا کامپایل شده اون مثلا چیزی مثل windows.obj رو کجا پیدا کنم در ویژوال استودیو؟
سوال دوم: بنده پژوهشی رو آغاز کردم در مورد api ها و وقتی در فایل های هدر گشت و گذار میکنم با syntax های عجیب غریبی رو به رو میشم. مثال;( برای بیماران قلبی توصیه نمیشود دیدن این مثال :لبخند:)
#ifdef __cplusplus
extern "C" {
#endif

/* Function prototypes */

_Check_return_wat_ _CRTIMP errno_t __cdecl _cgets_s(_Out_z_cap_(_Size) char * _Buffer, size_t _Size, _Out_ size_t * _SizeRead);
__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(errno_t, _cgets_s, _Deref_post_count_(*_Buffer) char, _Buffer, _Out_ size_t *, _SizeRead)
__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_0_CGETS(char *, _CRTIMP, _cgets, _Pre_notnull_ _Post_z_, char, _Buffer)
_Check_return_opt_ _CRTIMP int __cdecl _cprintf(_In_z_ _Printf_format_string_ const char * _Format, ...);
_Check_return_opt_ _CRTIMP int __cdecl _cprintf_s(_In_z_ _Printf_format_string_ const char * _Format, ...);
_Check_return_opt_ _CRTIMP int __cdecl _cputs(_In_z_ const char * _Str);
_Check_return_opt_ _CRT_INSECURE_DEPRECATE(_cscanf_s) _CRTIMP int __cdecl _cscanf(_In_z_ _Scanf_format_string_ const char * _Format, ...);
_Check_return_opt_ _CRT_INSECURE_DEPRECATE(_cscanf_s_l) _CRTIMP int __cdecl _cscanf_l(_In_z_ _Scanf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, ...);
_Check_return_opt_ _CRTIMP int __cdecl _cscanf_s(_In_z_ _Scanf_format_string_ const char * _Format, ...);
_Check_return_opt_ _CRTIMP int __cdecl _cscanf_s_l(_In_z_ _Scanf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, ...);
_Check_return_ _CRTIMP int __cdecl _getch(void);
_Check_return_ _CRTIMP int __cdecl _getche(void);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf(_In_z_ _Printf_format_string_ const char * _Format, va_list _ArgList);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf_s(_In_z_ _Printf_format_string_ const char * _Format, va_list _ArgList);

_Check_return_opt_ _CRTIMP int __cdecl _cprintf_p(_In_z_ _Printf_format_string_ const char * _Format, ...);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf_p(_In_z_ const char * _Format, va_list _ArgList);

_Check_return_opt_ _CRTIMP int __cdecl _cprintf_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, ...);
_Check_return_opt_ _CRTIMP int __cdecl _cprintf_s_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, ...);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf_s_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, va_list _ArgList);
_Check_return_opt_ _CRTIMP int __cdecl _cprintf_p_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, ...);
_Check_return_opt_ _CRTIMP int __cdecl _vcprintf_p_l(_In_z_ _Printf_format_string_ const char * _Format, _In_opt_ _locale_t _Locale, va_list _ArgList);

#ifdef _M_IX86
int __cdecl _inp(unsigned short);


تشکر بادا کسی که تحلیلی از کد بالا ارائه دهد که از وحشتم کاسته شود، برای مثلا انصافا
extern "c" {s
چه صیغه اییست؟
یا

_Check_return_ _CRTIMP int __cdecl _getch(void);


در این کد فقط میتونم بفهمم تابع _getch از نوع int است! بقیه را نمیدانم... وقتی هم کلیک راست میکنم مثلا رو _checkreturn_ و تعاریف را یکی پس از دیگری میروم به این میرسم که جلو تر تعریفی ندارد;

#define _Check_return_impl_

با این حساب فهمیدم تابع _getch از نوع _Check_return_impl_ نیز هست... حالا خود این در زبان سی یعنی چه خدا میداند!

کامبیز اسدزاده
شنبه 14 دی 1392, 21:02 عصر
این یک header هستش که از نوع C تعیین شده است.
برای بدست آوردن کامپایل شده هیدر های موجود هم باید خودتون اقدام به کامپایلشون نمایید.
در رابطه با extern "C" با وجودش در اول فایل شما مشخص میکند که کد ها بر اساس قوانین نامگذاری توابع در C نامگذاری میشوند و C++ آن را به رسمیت میشناسد.

1010011010
شنبه 14 دی 1392, 21:25 عصر
بخاطر جواب سوال دوم تشکر فراوان اما اولین سوالم مهم تر بود که متاسفانه جواب نگرفتم. بزارید مطلب رو بیشتر بشکافم.
ببینید معمولا در فایل هدر تعاریف می آیند و از مجموعه دستورالعمل های توابع خبری نیست مثلا در فایل هدر ss.h میزنه
int func()

بعد در فایل ss.c میزنه

int func () {
}
که در بلوک بین {} دستورات رو قرار میده

حالا چون معمولا ss.c کامپایل میشه، ما که میخوایم از تابع func استفاده کنیم، هدر ss.h رو به اول سورس اضافه میکنیم که بفهمیم تابعی وجود داره از نوع int و به نام func خوب حالا بعد از این که سورس رو کامپایل کردیم با کامپایل شده ss.obj مثلا لینک میشه... تا اینجا تصورم درسته؟؟؟

کامبیز اسدزاده
شنبه 14 دی 1392, 21:46 عصر
ببینید ذاتا استاندارد ترین روشی که به نظر من میتونه در زبان c/C++‎ بکار گرفته بشه رعایت استاندارد نویسی هست.
شما میتونیود همه کار ها رو در خود فایل .c یا .cpp انجام بدین ولی به صورت استاندارد باید طور دیگه ای نوشته شوند.
برای مثال من میام یک کدی رو مینویسم مثلا میخوام چند تا عدد رو باهم دیگه مقایسه کنم و بزرگترینش رو چاپ کنم در این صورت من کلاس یا توابع مربوط به این کار رو در فایلی به نام test.h می نویسم حالا این فایل test.h رو من فقط و فقط به صورت یک کلاس و توابع داخلی آماده میکنم طوری که تا فراخوانیش نکردم ازش استفاده نشه ! برای این کار میام یه فایل دیگه ای به نام test.cpp ایجاد میکنم حال در این فایل من دیگه نمیام دوباره توابع نویسی کنم و کلی بدبختی بکشم روش مستقیما یه وراثت از توابع و کلاسی که در فایل test.h نوشتم میگیرم که باید قبلش اون رو در داخل فایل .cpp وارد کنم به صورت INCLUDE و نام فایل.

حال در این مرحله من با وراثت گیری از کلاس و توابع میتونم فقط عملیات نحوه چاپ و دیگر عملیات اضافی رو روش انجام بدم یعنی عملیات محاسبه یافتن بزرگترین عدد در فایل .h صورت میگیرد و هروقت که لازم شد در هر قسمت از برنامه فقط و فقط با فراخوانی فایل و توابع درونی اون میتوان عملیات مربوطه رو اجرا کرد.

حالا در رابطه با extern "c" هم همینطور فرض کنید شما یه تابعی نوشتین در داخل یک فایل .h ولی کد هاتون از نوع C هست نه C++‎ در این صورت شما میتونید با وارد کردن extern "c" که یکی از قابلیت های C++‎ هست توابع نوشته شده به زبان C رو در C++‎ اجرا کنید.

1010011010
چهارشنبه 18 دی 1392, 10:08 صبح
سوالم رو ویرایش کردم. جواب سوال اولم رو نگرفتم. یه پرسش اضافه تو سوال دومم پرسیدم.

لطفا اساتید کمک کنید، خصوصا سوال اول.

rahnema1
چهارشنبه 18 دی 1392, 12:29 عصر
سلام، فایل windows.h جهت استفاده از توابع win api یا تابع های موجود در dll های اصلی ویندوز (dynamic load library) به کار میره مثل kernel32.dll یا user32.dll اما واسه اینکه فایل اچ بتونه از این فایلهای دی ال ال استفاده کنه یک سری کتابخانه های استاتیک با پسوند lib (واسه کامپایلر مایکروسافت) یا پسوند a. واسه کامپایلر gcc تحت ویندوز در فولدر lib قرار داده شده که همنام فایلهای دی ال ال هستند بنابراین وقتی که می خواهیم از فایل اچ استفاده کنیم حتما لازم نیست یک فایل با پسوند c وجود داشته باشه که تعریف تابع در اون باشه بلکه می تونیم از یک لایبری استاتیک مثلا با پسوند lib استفاده کنیم که درون آن کد کامپایل شده قرار داره

1010011010
پنج شنبه 19 دی 1392, 11:48 صبح
بخش آخر سوالم اساتید ج بدن متشکر میشم.

rahnema1
پنج شنبه 19 دی 1392, 15:29 عصر
بخش آخر کدام سوال؟
یکی از سوالات در مورد کلمات کلیدی بود که در فایل اچ استفاده شده. ببینید علاوه بر کلمات کلیدی که در استاندار سی پلاس پلاس تعریف شده خود کامپایلر ها هم یک سری کلمات کلیدی را به زبان اضافه کرده اند بنابراین تفسیری که شما ارائه دادید که تابع از نوع Check_return_impl_ هست درست نیست
برای مشاهده چیزهایی که بعنوان توسعه به زبان اضافه شده برای کامپایلر ++vc به این منبع:
http://msdn.microsoft.com/en-us/library/34h23df8.aspx و
http://msdn.microsoft.com/en-us/library/2e6a4at9.aspx
و کلمات کلیدی gcc به این منبع:
http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html#C_002b_002b-Extensions
رجوع کنید درضمن شما لازمه در زمینه نحوه استفاده از define# هم مطالعه کنید حالا یک منبعش میتونه این باشه:
publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0948150.pdf