PDA

View Full Version : ماکرو T__ با عملگر ##



meysamg_alone
یک شنبه 16 فروردین 1388, 14:07 عصر
سلام به دوستان من تازه کار هتسم اگه امکان داره یکی به من بگه که فرق این دو تا کد چیه



#define __T(x) L##x
#define __T(x) Lx

Nima_NF
یک شنبه 16 فروردین 1388, 19:16 عصر
اولی که با ## هست هر چیزی که x باشد را با حرف L ادغام می کند:



#define __T(x) L##x
TCHAR* str1 = __T("My text");
//--------------
TCHAR* str2 = L"My text";

L در اینجا یعنی نوشته ما از نوع یونیکد هست، لذا باید در TCHAR ذخیره شود.



دومی اشتباه هست و اگر از آن استفاده کنید خطا دریافت می کنید، چون Lx در ماکرو معادل ندارد. مگر اینه منظور شما این است که Lx قبلا تعریف شده است و الآن می خواهید از آن استفاده کنید (این چیزی هست که ماکرو از Lx می فهمد)، مثلا:



int Lx = 12;
#define __T2(x) Lx

//---------
int d = __T2(5); // 5 will be ignored
cout << d;

meysamg_alone
سه شنبه 18 فروردین 1388, 16:03 عصر
خوب اگه ما بخوایم از هر ماکرویی استفاده کنیم تویه دیفاین باید از عملگر ## استفاده کنیم اونم دوتا پشت سر هم ؟ درسته ؟ ایا حالت دیگه ای هم تویه دی فاین هست مثلا از یه عملگر دیگه اسفاده بشه به جایه ## ؟!

Nima_NF
سه شنبه 18 فروردین 1388, 16:55 عصر
وقتی از ## (فقط هم در ماکرو ها) استفاده می کنیم که می خواهیم طرف راست ## را با طرف چپ آن ادغام / merge / concat کنیم. مثلا طرف راست 2 و طرف چپ 1 و نتیجه 12 را بدهد (یعنی دو طرف را به هم بچسباند):



#define __T1( ) 1##2
//-----------
int num = __T1( );




پس اگر ماکروی مورد نظر شما به این کار نیاز ندارد اصلا از ## استفاده نمی کنیم.




#define __T1(x) (x / 10)
#define __T2(x, y) (x + y)
#define __T3(x, y , z) ((x + y)/(5 + z))

meysamg_alone
چهارشنبه 19 فروردین 1388, 17:14 عصر
ممنون متوجه شدم :لبخندساده:

حسین محمدی
شنبه 26 اردیبهشت 1388, 20:29 عصر
می توان ماکرویی را تعریف کرد که مثلا حاصل



__T(x)

برابر


"x"

شود.
البته عبارت ما جایگزین x شود.

مثلا


__T1(Hello)

بشود.


"Hello"