View Full Version : سوال: استفاده از متغیر سراسری
fahimeh1512
چهارشنبه 14 خرداد 1393, 20:49 عصر
سلام با کامپایلر ویژوال استودیو وقتی بخوام متغیری رو تو یه فایل .cpp تعریف کنم و از فایلهای سی پی پی دیگه هم بتونم اون متغیر رو مقداردهی بکنم یا مقدارشو بخونم باید اون متغیر و چجوری تعریف کنم؟؟
با extern نمیشه؟تو یه کتاب زبان سی خوندم که اینجوری میشه تو همه فایلا ازش استفاده کرد ولی ظاهرا جواب نمیده
omid_kma
پنج شنبه 15 خرداد 1393, 01:52 صبح
آره با extern شدنیه http://www.7khatcode.com/index.php?qa=790&qa_1=%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-global-%D8%AF%D8%B1-%DA%86%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84&show=808#a808
مثلا :
فایل Test.h :
int a=3;
فایل main
#include <iostream>
#include <Test.h>
using namespace std;
extern int a;
int main() {
cout<<a;
}
fahimeh1512
پنج شنبه 15 خرداد 1393, 09:41 صبح
آره با extern شدنیه http://www.7khatcode.com/index.php?qa=790&qa_1=%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-global-%D8%AF%D8%B1-%DA%86%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84&show=808#a808
مثلا :
فایل Test.h :
int a=3;
فایل main
#include <iostream>
#include <Test.h>
using namespace std;
extern int a;
int main() {
cout<<a;
}
اگه قرار باشه تو هدر تعریفش کنم و هدرشو اول کدم بذارم میشه ازش راحت استفاده کرد دیگه چه نیازیه که دوباره اون متغیر و تو کد به صورت اکسترن تعریف کنم؟ یعنی الان بدون این خط نتیجه رو نمیده؟
extern int a;
fahimeh1512
پنج شنبه 15 خرداد 1393, 13:04 عصر
الان من میخوام چند تا تعریف و تو یه هدر بذارم که اون هدر رو چندجا باید اینکلود کنم و از اون تعاریف استفاده کنم با بررسی هایی که انجام دادم به دستورای #ifndef و ...رسیدم ولی نمیدونم باز مشکل از کجاست که همون ارورای قبلی رو میده یعنی میگه
main.obj : error LNK2005: "wchar_t * system32_path" (?system32_path@@3PEA_WEA) already defined in GetDirectories.obj
4>main.obj : error LNK2005: "wchar_t * cmd_path" (?cmd_path@@3PEA_WEA) already defined in GetDirectories.obj
directories.h
#ifndef directories_h_
#define directories_h_
LPWSTR system32_path=new WCHAR [MAX_PATH];
LPWSTR cmd_path=new WCHAR [MAX_PATH];
#endif
هم تو main هم تو Getdirectories.cpp باید از این هدر استفاده کنم تازه تو یه فایل دیگه هم باید باشه کمکککککک:گریه:
fahimeh1512
پنج شنبه 15 خرداد 1393, 13:05 عصر
ضمنا با این روش نیازی به استفاده از اکسترن هست یا نه؟
omid_kma
پنج شنبه 15 خرداد 1393, 14:54 عصر
اگه قرار باشه تو هدر تعریفش کنم و هدرشو اول کدم بذارم میشه ازش راحت استفاده کرد دیگه چه نیازیه که دوباره اون متغیر و تو کد به صورت اکسترن تعریف کنم؟ یعنی الان بدون این خط نتیجه رو نمیده؟
extern int a;
نه بالاخره لینکر باید یک جوری بفهمه که این x همون x داخل اون فایله اگر extern نزاری نمی تونه تشخیص بده
حالت عادی فرض می کنه که این x فقط داخل همون هدر قابل استفادست.
omid_kma
پنج شنبه 15 خرداد 1393, 15:08 عصر
الان من میخوام چند تا تعریف و تو یه هدر بذارم که اون هدر رو چندجا باید اینکلود کنم و از اون تعاریف استفاده کنم با بررسی هایی که انجام دادم به دستورای #ifndef و ...رسیدم ولی نمیدونم باز مشکل از کجاست که همون ارورای قبلی رو میده یعنی میگه
main.obj : error LNK2005: "wchar_t * system32_path" (?system32_path@@3PEA_WEA) already defined in GetDirectories.obj
4>main.obj : error LNK2005: "wchar_t * cmd_path" (?cmd_path@@3PEA_WEA) already defined in GetDirectories.obj
directories.h
#ifndef directories_h_
#define directories_h_
LPWSTR system32_path=new WCHAR [MAX_PATH];
LPWSTR cmd_path=new WCHAR [MAX_PATH];
#endif
هم تو main هم تو Getdirectories.cpp باید از این هدر استفاده کنم تازه تو یه فایل دیگه هم باید باشه کمکککککک:گریه:
استفاده از متغیر GLobal به این شکل کار درستی نیست حداقل اینارو داخل namesace بزارین یا struct .
, و آره نیاز به extern هست
ضمنا برای استفاده از .h داخل چند تا فایل باید داخل header از extern استفاده کنین داخل cpp فایل ها ازش استفاده کنین . مثلا
Test.h :
extern int*a
test.cpp
a=new int[12
main.cpp
cout<<a[2
fahimeh1512
پنج شنبه 15 خرداد 1393, 15:36 عصر
یعنی اینجوری باید درست بشه؟
#ifndef directories_h_
#define directories_h_
namespace directory {
LPWSTR system32_path=new WCHAR [MAX_PATH];
LPWSTR cmd_path=new WCHAR [MAX_PATH];
}
#endif
اینجوری استفاده میکنم دیگه
wcscmp(current_directory,directory::system32_path)
بازم همون ارورارو میده اخه
omid_kma
پنج شنبه 15 خرداد 1393, 16:04 عصر
فرقی نمی کنه بازم نیاز به Extern داری
توی ++C داخل فایل .h باید فقط declaration وجود داشته باشه داخل فایل .cpp از new استفاده کرد .
directory.h رو به این شکل بزار :
#ifndef directories_h_
#define directories_h_
namespace Directory {
extern LPWSTR system32_path;
extern LPWSTR cmd_path;
}
#endif
بعد directory.cpp :
#include <directory.h>
LPWSTR Directory::system32_path=new WCHAR [MAX_PATH];
LPWSTR Directory::cmd_path=new WCHAR [MAX_PATH];
بعد حالا داخل هر فایل دیگه ای که خواستی ازش استفاده کن
wcscmp(current_directory,directory::system32_path)
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.