Definire globala a unei variabile de tip definit utilizator

Intrebari despre limbajul C++/CLI (si versiunile mai vechi MC++), applicatii mixed-mode sau probleme specifice .NET legate de C++.
User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Silviu Ardelean » 20 Jun 2010, 23:03

Ovidiu Cucu wrote:[*] incepator-avansat: am citit "Effective C++" si-am aflat ca "macros are evil"

Code: Select all

extern const UINT WM_APP_MESSAGE0;
extern const UINT WM_APP_MESSAGE1;
extern const UINT WM_APP_MESSAGE2;
// ... and so on.
Ori fi macro-urile evil, dar nu si in acest caz (merita renuntat la ele doar din idee de "good practice"). La exemplul asta dar si urmatorul s-a uitat asignarea WM_APP+i. :D
In rest ma abtin sa n-o iau pe urma lu' Napoleon. :cheers:



User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Definire globala a unei variabile de tip definit utiliza

Post by cristianamarie » 21 Jun 2010, 08:51

Silviu Ardelean wrote:
Ovidiu Cucu wrote:[*] incepator-avansat: am citit "Effective C++" si-am aflat ca "macros are evil"

Code: Select all

extern const UINT WM_APP_MESSAGE0;
extern const UINT WM_APP_MESSAGE1;
extern const UINT WM_APP_MESSAGE2;
// ... and so on.
Ori fi macro-urile evil, dar nu si in acest caz (merita renuntat la ele doar din idee de "good practice"). La exemplul asta dar si urmatorul s-a uitat asignarea WM_APP+i. :D
In rest ma abtin sa n-o iau pe urma lu' Napoleon. :cheers:
Cind mai simplu ar fi de pus intr-o clasa cu statics

Code: Select all

class UserMessages {
private:
  UserMessages() {}
  ~UserMessages() {}
  UserMessages(const UserMessages&);
  UserMessages& operator=(const UserMessages&);
public:
  static const UINT WM_APP_MESSAGE1 = (WM_APP + 1);
  // ...
};
Sau ca la C intr-un user-messages.h

Code: Select all

#ifndef __user_messages_defined__
#define __user_messages_defined__

#ifndef WM_APP_MESSAGE1
  #define WM_APP_MESSAGE1 (WM_APP + 1)
#endif
//... etc

#endif //  __user_messages_defined__
Nuclear launch detected

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Silviu Ardelean » 21 Jun 2010, 09:27

Dupa cum ziceam, in mod normal nu vad de ce nu am folosi banalele declarari in stil C.
E drept, daca faci asta si folosesti un analizator static de cod C++ (ex. pclint) s-ar putea sa latre... ca folosesti macrouri. In situatia data nu vad nici o problema legata de atentionarea lu' Scott Meyers.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 21 Jun 2010, 12:16

Silviu Ardelean wrote:
Ovidiu Cucu wrote:[*] incepator-avansat: am citit "Effective C++" si-am aflat ca "macros are evil"

Code: Select all

extern const UINT WM_APP_MESSAGE0;
extern const UINT WM_APP_MESSAGE1;
extern const UINT WM_APP_MESSAGE2;
// ... and so on.
[...] s-a uitat asignarea WM_APP+i. [...]
Nu s-a uitat ci nu s-a transmis pe post.
Mai complet si spre multumirea tuturor ar fi trebuit sa scriu

Code: Select all

// AppUserMessages.h
#pragma once

extern const UINT WM_APP_MESSAGE0;
extern const UINT WM_APP_MESSAGE1; 
extern const UINT WM_APP_MESSAGE2;
// ... and so on.

// NOTE: all above are declarations.
// Declarations tell the compiler that a program element or name exists.
// It's like someone tells you "There is a girl named Alice".

// SEE ALSO: definitions in AppUserMessages.cpp note.

Code: Select all

// AppUserMessages.cpp
#include "AppUserMessages.h"

const UINT WM_APP_MESSAGE0 = WM_APP;
const UINT WM_APP_MESSAGE1 = WM_APP+1;
const UINT WM_APP_MESSAGE2 = WM_APP+2;
// ... and so on.

// NOTE: all above are definitions.
// Definitions specify what code or data the name describes.
// It's like someone tells you "Alice is a gorgeous girl, 25 years old, and lives next door to you".

// SEE ALSO: declarations in AppUserMessages.h note.
As spus doar ca am scurtat-o ca sa incapa in forum. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 21 Jun 2010, 13:01

Referitor la cea de-a doua "omisiune".
Ovidiu Cucu wrote:

Code: Select all

class CMessageHelper
{
public:
   static const UINT WM_APP_MESSAGE0;
   static const UINT WM_APP_MESSAGE1;
   static const UINT WM_APP_MESSAGE2;
   // ... and so on.
};
Ar fi trebuit sa scriu

Code: Select all

// MessageHelper.h - CMessageHelper class definition file
#pragma once

class CMessageHelper
{
public:
   static const UINT WM_APP_MESSAGE0;
   static const UINT WM_APP_MESSAGE1;
   static const UINT WM_APP_MESSAGE2;
   // ... and so on
};

Code: Select all

// MessageHelper.cpp - CMessageHelper class implemetation file
#include "MessageHelper.h"

const UINT CMessageHelper::WM_APP_MESSAGE0 = WM_APP;
const UINT CMessageHelper::WM_APP_MESSAGE1 = WM_APP + 1;
const UINT CMessageHelper::WM_APP_MESSAGE2 = WM_APP + 2;
// ... and so on
Stiu, se poate, e mai simplu si in anumite situatii mai avantajos sa scrii

Code: Select all

class CMessageHelper
{
public:
   static const UINT WM_APP_MESSAGE0 = WM_APP;
   static const UINT WM_APP_MESSAGE1 = WM_APP + 1;
   static const UINT WM_APP_MESSAGE2 = WM_APP + 2;
   // ... and so on
};
Problema e ca unele compilatoare mai vechi nu accepta asa ceva.
Pe forumuri, in general ma stradui sa pun, pe cat se poate, cod compatibil si cu acastea.
Cine mai are VS6.0 poate sa verifice. ;)

Si ca sa inchei.
Ar mai fi o alternativa si mai convenabila si mai putin supusa la greseli.

Code: Select all

enum e_AppUserMessages
{
   WM_APP_MESSAGE0 = WM_APP,
   WM_APP_MESSAGE1,
   WM_APP_MESSAGE2,
   // ... and so on.
};
Eventual, ca sa fim mai catolici decat Papa si sa nu maraie nici un OO-guru, o incapsulam in CMessageHelper. :)

[ Later edit ]
Tot eseul ala e la panarama.
Nu v-ati prins? :biggrin:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 21 Jun 2010, 14:22

Silviu Ardelean wrote:[...] un analizator static de cod C++ (ex. pclint) s-ar putea sa latre... ca folosesti macrouri.
Din cate stiu eu si-am avut "fericirea" sa constat la fata locului, pclint-ul nu musca, nu latra daca vede macro-uri.
Ar fi un dezastru deoarece acolo unde-i folosit, macro-urile is la putere.
L-ar trimite imediat la eutanasie pentru ca si-asa-i destul de agresiv. :biggrin:
Ovidiu Cucu wrote: Tot eseul ala e la panarama.
Nu v-ati prins? :biggrin:
Un titlu mai potrivit ar fi fost "Cum poti deveni expert in a te scarpina la urechea dreapta cu degetul de la piciorul stang".

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Silviu Ardelean » 21 Jun 2010, 14:27

Ovidiu Cucu wrote: Din cate stiu eu si-am avut "fericirea" sa constat la fata locului, pclint-ul nu musca, nu latra daca vede macro-uri.
Ar fi un dezastru deoarece acolo unde-i folosit, macro-urile is la putere.
L-ar trimite imediat la eutanasie pentru ca si-asa-i destul de agresiv. :biggrin:
Depinde unde folosesti PCLint. Daca e vorba de embeded, te inteleg. :D
Eu il folosisem pe o aplicatie PC ce testa o camera video pe linia de productie. Iar aplicatia respectiva era una C++. Iar el, la erorile ce le scuipa facea la greu referire la cartea lui Meyers.

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: Definire globala a unei variabile de tip definit utiliza

Post by viorel2005 » 21 Jun 2010, 14:54

pentru exemplul 5:
expert (architect): OOP-ul "clasic" a devenit boring, nu mai impresioneaza managerii, asa ca dam tarcoale la chestii mai avansate
1.Este adoptat aces stil pentru mesaje in general?
2.In ce tip de aplicatii end-user in C++ merita sa adoptam acel stil de programare?

Am cautat pe code.google.com despre libraria Loki. Tot respectul pentru creatorul acelei librarii, dar sunt aplicatii care au nevoie de acel nivel de complexitate?
Adica, un programator de C++ poate invata ceva mai util in loc sa scrie un astfel de cod?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 21 Jun 2010, 17:18

Silviu Ardelean wrote:
Ovidiu Cucu wrote: Din cate stiu eu si-am avut "fericirea" sa constat la fata locului, pclint-ul nu musca, nu latra daca vede macro-uri.
Ar fi un dezastru deoarece acolo unde-i folosit, macro-urile is la putere.
L-ar trimite imediat la eutanasie pentru ca si-asa-i destul de agresiv. :biggrin:
Depinde unde folosesti PCLint. Daca e vorba de embeded, te inteleg. :D
Eu il folosisem pe o aplicatie PC ce testa o camera video pe linia de productie. Iar aplicatia respectiva era una C++. Iar el, la erorile ce le scuipa facea la greu referire la cartea lui Meyers.
Stiu, bajetii care l-au facut au citit multe carti si au extras multe chestii bune de acolo.
Din pacate nimic, oricat de bun ar fi, nu poate fi universal valabil.
De exemplu, scrii o aplicatie cu Windows API si ai

Code: Select all

::SendMessage(hWnd, WM_GETTEXT, static_cast<WPARAM>(nBuffLen), reinterpret_cast<LPARAM>(lpBuffer));
Daca javra nu maraie ca ai facut reinterpret_cast, sigur face "Ham, ham!" pentru ca ai convertit intreg la pointer (sau invers).
Chestie foarte periculoasa, o stie si un architect incepator. :biggrin:
Deci va fi greu pentru un developer, fie el si senior cu deshtele batatorite la tastatura, sa-l convinga ca altfel nu se poate.

Cat despre macro-uri, nu erau banned nici macar la C++.
Potaia le expanda si dupa aia se apuca gospodareste de analiza. Deci, prima incercare de a o fenta cu macro-uri n-are success.
Are totusi calcaiul lui Ahile: se uita doar la fisiere cu anumite extensii (.C .CPP .H). Deci se pot ascunde mizerii sub pres.
Pui ce nu-i place in functii inline si le plasezi in fisiere .INL.
Nimic gresit din punct de vedere programatoricesc. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Definire globala a unei variabile de tip definit utiliza

Post by Ovidiu Cucu » 21 Jun 2010, 17:50

viorel2005 wrote:pentru exemplul 5:
expert (architect): OOP-ul "clasic" a devenit boring, nu mai impresioneaza managerii, asa ca dam tarcoale la chestii mai avansate
1.Este adoptat aces stil pentru mesaje in general?
NU. Sigur nu.
viorel2005 wrote:2.In ce tip de aplicatii end-user in C++ merita sa adoptam acel stil de programare?
Probabil ca da, intr-una pe care o scriem incepand cu sistemul de operare si terminand cu user interface.
Desi, cred ca si-acolo s-ar putea spune "pass!" :).
viorel2005 wrote:Am cautat pe code.google.com despre libraria Loki. Tot respectul pentru creatorul acelei librarii, dar sunt aplicatii care au nevoie de acel nivel de complexitate?
Adica, un programator de C++ poate invata ceva mai util in loc sa scrie un astfel de cod?
Te referi probabil la biblioteca Loki a lui Alexandrescu despre care scrie in "Modern C++ Design".
Cartea poate fi interesanta pentru a ciupi ceva notiuni avansate de programare C++ dar si ca tratament de soc pentru cei intoxicati cu GoF. :)


Parerea mea. Altii pot fi de alta parere.

Post Reply