PDA

View Full Version : سوال: استفاده از متغیر سراسری



fahimeh1512
چهارشنبه 14 خرداد 1393, 19:49 عصر
سلام با کامپایلر ویژوال استودیو وقتی بخوام متغیری رو تو یه فایل .cpp تعریف کنم و از فایلهای سی پی پی دیگه هم بتونم اون متغیر رو مقداردهی بکنم یا مقدارشو بخونم باید اون متغیر و چجوری تعریف کنم؟؟
با extern نمیشه؟تو یه کتاب زبان سی خوندم که اینجوری میشه تو همه فایلا ازش استفاده کرد ولی ظاهرا جواب نمیده

omid_kma
پنج شنبه 15 خرداد 1393, 00: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, 08: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, 12: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, 12:05 عصر
ضمنا با این روش نیازی به استفاده از اکسترن هست یا نه؟

omid_kma
پنج شنبه 15 خرداد 1393, 13:54 عصر
اگه قرار باشه تو هدر تعریفش کنم و هدرشو اول کدم بذارم میشه ازش راحت استفاده کرد دیگه چه نیازیه که دوباره اون متغیر و تو کد به صورت اکسترن تعریف کنم؟ یعنی الان بدون این خط نتیجه رو نمیده؟
extern int a;
نه بالاخره لینکر باید یک جوری بفهمه که این x همون x داخل اون فایله اگر extern نزاری نمی تونه تشخیص بده
حالت عادی فرض می کنه که این x فقط داخل همون هدر قابل استفادست.

omid_kma
پنج شنبه 15 خرداد 1393, 14: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, 14: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, 15: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)