[VC++] Determinarea valorii unei macrodefiniţii

Mediul de dezvoltare Visual C++, instalare, setari, debugger, compilator, linker si documentatie (forum moderat)
Post Reply
Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

[VC++] Determinarea valorii unei macrodefiniţii

Post by Viorel » 28 Nov 2007, 09:59

Valoarea unei macrodefiniţii simple, precum WINVER, poate fi aflată şi cu ajutorul unei funcţii de afişare. De exemplu:

Code: Select all

#include <windows.h>
#include <stdio.h>

. . .

printf("%i\n", WINVER);
Evident că este necesară lansarea în execuţie. Dacă sîntem interesaţi de valoarea macrodefiniţiei fără rularea programului, o putem căuta în fişierele H. Problema se complică dacă definiţia se bazează pe directive de tip #if şi depinde de alte definiţii sau opţiuni de compilare.

În continuare propunem o soluţie pentru determinarea macrodefiniţiilor la faza de compilare. Vom prezenta şi o metodă pentru aflarea macrodefiniţiilor cu parametri.

Mai întîi se vor declara două macrodefiniţii ajutătoare:

Code: Select all

#define M(m) #m ": " M2(m)
#define M2(m) #m
Avînd aceste definiţii auxiliare, valoarea unor macrodefiniţii fără parametri se va afişa prin intermediul directivei #pragma:

Code: Select all

#pragma message(M(WINVER))
Aceasta afişează în panoul de ieşire al compilatorului (Output) un text ca următorul:

Code: Select all

WINVER: 0x0901
Pentru determinarea unei macrodefiniţii cu parametri, ca de pildă MAKEWORD şi MAKEINTRESOURCE, se vor specifica nişte parametri oarecare. De exemplu:

Code: Select all

#pragma message(M(MAKEWORD(a, b)))
#pragma message(M(MAKEINTRESOURCE(1234)))
Acestea afişează:

Code: Select all

MAKEWORD(a,b): ((WORD)(((BYTE)((DWORD_PTR)(a) & 0xff)) | ((WORD)((BYTE)((DWORD_PTR)(b) & 0xff))) << 8))
MAKEINTRESOURCE(1234): ((LPWSTR)((ULONG_PTR)((WORD)(1234))))
De notat că macrodefiniţiile necunoscute se prezintă prin simpla repetare a numelui. De exemplu, directiva #pragma message(M(WINVER123)) afişează doar WINVER123: WINVER123.

Concluzie. În Visual Studio, valoarea unei macrodefiniţii, aşa cum este vazută de compilator într-un punct dat al programului, poate fi determinată cu ajutorul directivei #pragma message şi a două definiţii auxiliare.


Next FAQ >>



Post Reply