c ++ - Windows API og GetClassName ()? Et andet navn?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har nogle kodeord, der har et dynamisk klasse system i C ++, der har et medlem kaldet GetClassName (), et ret harmløst navn man kunne forestille sig. Men da det blev medtaget i et stort projekt med Windows-overskrifter, brød helvede løs. Tilsyneladende bruger Windows et #definalt GetClassName (GetClassNameA eller GetClassNameW), som skruer op alt, og mit virtuelle opkaldstræ blev alt forvirret, så jeg tabte en dag i dum compiler debugging i mørket og forsøgte at finde ud af, hvad der var galt.


Så ud over det punkt, at jeg forbander Microsoft til at bruge sådan en frygtelig let at kollidere navn til en #define (jeg mener, at nogen ærligt skal være skudt for dette!) Jeg beder om 3 formål.



  1. Hvad er et andet godt navn til
    GetClassName ()?

  2. Er der alligevel at
    løse dette, så i fremtiden, andre
    udviklere af min kode base vandt 't
    lide lignende skæbne

  3. Og for
    efterkommere når nogen anden
    møder dette på samme måde
    uforklarlig fejl


Bedste reference


Jeg ville omdøbe metoden.


Selvfølgelig kan man sige


#include <windows.h>
#undef GetClassName


men det er ikke rent, brugerne af en 's kode skal huske at skrive :: GetClassNameW når de kalder win32 funktion.


Man kan give GetClassNameA og GetClassNameW metoder i sin klasse, men det er helt grimt.


Jeg ser to tilgange: enten forlænge eller forkorte navnet :)


1) Tilføj et præfiks for alle funktioner i delsystemet, f.e TI\_ (for type info):


TI\_GetClassName() 
TI\_GetBaseClass() 
TI\_IsDerivedFromClass()
etc  


2) eller sæt dem i nogle IClass-grænseflader


interface IClass {
GetName();
GetBase(); 
IsDerivedFrom();
etc


og returner den grænseflade fra en enkelt metode,

således at GetClassName () bliver


GetClass()->GetName()

Andre referencer 1



  1. ClassGetName()

  2. #undef GetClassName

  3. WinAPI er en C API. Ingen navnepladser. Nogle andre platforme forsøger at afbøde dette ved at prefixere alle symbolnavne, men i sidste ende falder det fra hinanden. Bedste satsning: Hvis du skriver kode, der ikke afhænger af Windows Platform SDK-overskrifterne, så gør du dem ikke .


Andre referencer 2


GetWindowClassName måske? I virkeligheden er GetClassName ikke et dårligt navn til denne API, da det vedrører vinduesklasser. Det reelle problem er, at det er en C API-erklæring og C-erklæringer, har ingen måde at indføre en genanvendelig erklæring, der ikke forurener det globale navneområde.


Dette er meget mere en manglende C-sprog end Microsoft.

Andre referencer 3


Windows API er chock fuld af makroer med rene navne, der udvider til funktionsnavne med et suffiks, der angiver ASCII/UTF-16, afhængig af byggemuligheder. Det ville have været godt, hvis de prefixede alt med 'W32' eller lignende (a la 'NS' på OS X), men de valgte ikke at formode at holde API'en 'ren'.


Da det er meget nemmere at ændre din kode end deres API, er der et par forslag:


1) Lær Windows API (det er faktisk ikke så stort!) Eller i det mindste bekendt med MSDN, så du kan kigge efter navne sammenstød, når du støder på uforklarlig programflyt. [8]


2) Brug eksplicit rækkeviddeopløsning i din kode, hvor du kan (MyClass :: GetClassName ()). Desværre vil dette bryde den virtuelle funktionsforsendelse, så vær forsigtig med dette.


3) Brug en anden navngivningskonvention i din kode. MS bruger altid CamelCase, så du vandt ikke sammenstød, hvis du vælger en anden konvention (get\_class\_name (), getClassName (), osv.).


4) Jeg hader personligt at navngive mine getters & settere 'GetX ()' og 'SetX ()', men foretrækker at læne på overbelastningsmekanismen og bruge 'xtype X () const' til getters og 'void X (xtype newval)' til settere. Din kilometertal kan variere, men jeg finder det renere & get/set er indlysende fra argumenterne. Du skal selvfølgelig være forsigtig, hvis du bruger standard argumenter.


Held og lykke!