Tag Archives: #define

[Coketorial C++] macro: transform the parameter into a string

A while ago I wanted to create a macro that would transform the parameter intr-o a character string, something like:

CString strString = MACRO(666;puppies); // => strString = “666;puppies”

I wanted to do so because I was going to create another, more complex macro that would declare/define some functions for classes, without having to take time for each class and implementing the functions manually. Well, that’s how I found out that in order to transform a macro’s parameter into a character string, you need, in fact, 2 macros, as follows:

#define Intermediary(parameter) #parameter
#define StringMachine(anyparameter) Intermediary(anyparameter)

That simple. That’s how I moved on and created another macro that would create a function that returned the class’s name:

#define DEFINE_CLASS(className) public:
virtual CString name() const { return StringMachine(className); };

Now I’m using this macro inside each class in order to be able to get at any time the name of the class. Something like:

class ClassName

{

DEFINE_CLASS(className)

}

, a thing that makes my work a lot easier because I only have to write 3 words instead of tens (depends on the complexity of the DEFINE_CLASS macro).

For the program to work (if you use CString, that is) you must also include atlstr.h. For more information about CString go here.

If you have questions, don’t hestitate to post a comment.

[Coketorial C++] macro: transforma parametrul intr-un string

Deoarece blogu’ nu poate sau nu ar trebui să poată să interpreteze C++ voi aborda un subiect din această ramură.

Acum ceva vreme am vrut să fac un macro care să transforme parametrul într-un șir de caractere, ceva de genu:

CString strString = MACRO(666;de;cățeluși); // => strString = “666;de;cățeluși”

Doream să fac asta deoarece urma să fac un macro mai mare care să declare/definească niște funcții pentru fiecare clasă pe care urma să o creez, ca să nu stau în dreptul fiecăreia și să scriu de fiecare dată funcțiile în mod personalizat. Bun, astfel am descoperit că pentru a transforma un parametru al unui macro într-un șir de caractere îți tre’, de fapt, două macro-uri, și anume:

#define Intermediar(parametru) #parametru
#define StringMachine(oriceparametru) Intermediar(oriceparametru)

Atât de simplu. Astfel am reușit să fac un macro ca pentru fiecare clasă să-mi creeze o funcție care să-mi returneze numele acesteia:

#define DEFINE_CLASS(className) public:
virtual CString name() const { return StringMachine(className); };

Acum folosesc acest macro în cadrul fiecărei clase pentru a avea la îndemână oricând numele acesteia. Ceva de genu’:

class NumeleClasei

{

DEFINE_CLASS(NumeleClasei)

}

, lucru care îmi ușurează munca deoarece trebuie să scriu doar 3 cuvinte în loc de zeci (depinde de complexitatea macro-ului DEFINE_CLASS).

Pentru ca programul să meargă (asta dacă folosești CString) tre’ să incluzi și fișierul atlstr.h. Pentru mai multe informații despre CString intră aici.

Dacă ai întrebări, nu ezita să postezi un comment.

Dilema [re-editat]

Astazi faceam testele “orientative” pe care le pune la dispozitie Facultatea de Informatica Manageriala, si m-am apucat de intrebarile de C++. Nu va spun rezultatul, dar am ajuns la o intrebare interesanta, care m-a pus in incurcatura vreo 10-15 minute. Ea suna asa:

#define f(x) x*x

void main()
{

cout<<f(3+5);

}

Care este output-u’ acestei secvente? 23. Logic (nu glumesc, chiar asa este…). Cine isi da seama care-i faza in mai putin de 2 minute, are o bonboana…

Later edit [1:17 AM]:

Citind prin acea cartulie raspunsurile la problemele “rezolvate” de mine (ma verificam :P), am observat ca unele erau gresite. Ma rog, cel putin la compilarea lor in VC++2008 sau in timpul rularii fie dadeau eroare de compilare, fie o bagau pe faimoasa “Run-Time Check Failure #3”. Asa ca m-am gandit: io daca o sa scriu raspunsu’ care se considera in anul 2008 a fi corect, o sa mi-o iau in freza, pentru caaaa (a se citi cu voce de Gigi Becali) dupa standardele impuse de C++ din preistorie este eronat. Acum se pune evidenta problema: cine are dreptate? Visual C++ 1986 sau Visual C++ 2008. Not funny (ca in videoclipu’ ala cu pustiu’). Sa vedem ce spune Prof. Conf. Univ. Dr. Daniela Crisan maine, asta daca imi raspunde :)). Sper sa imi pice o problema d-asta gresita la simulare ca sa il santajez pe Iacob sa ma treaca daca ii dovedesc ca e gresita, haha.

[polldaddy poll=”691790″]