DOMANDA C - C++| Esiste un libro che mi aiuti a capire il codice arcano scritto dai pro?

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Ogni volta che apro qualche header scritto da professionisti, mi ritrovo di fronte a patterns che non ho mai visto e non riesco a capire, esempio, qual'è il punto di questo define nel codice sotto? A prima vista sembra quasi inutile, ma sono sicuro che ha uno scopo:
C++:
#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)

Oppure, cosa sta succedendo qui?!

C++:
#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)


EXTERN_C CONST IID IID_ID2D1Resource;
EXTERN_C CONST IID IID_ID2D1Image;
EXTERN_C CONST IID IID_ID2D1Bitmap;
EXTERN_C CONST IID IID_ID2D1GradientStopCollection;
EXTERN_C CONST IID IID_ID2D1Brush;
EXTERN_C CONST IID IID_ID2D1BitmapBrush;
EXTERN_C CONST IID IID_ID2D1SolidColorBrush;
EXTERN_C CONST IID IID_ID2D1LinearGradientBrush;
EXTERN_C CONST IID IID_ID2D1RadialGradientBrush;
EXTERN_C CONST IID IID_ID2D1StrokeStyle;
EXTERN_C CONST IID IID_ID2D1Geometry;
EXTERN_C CONST IID IID_ID2D1RectangleGeometry;
EXTERN_C CONST IID IID_ID2D1RoundedRectangleGeometry;
EXTERN_C CONST IID IID_ID2D1EllipseGeometry;
EXTERN_C CONST IID IID_ID2D1GeometryGroup;
EXTERN_C CONST IID IID_ID2D1TransformedGeometry;
EXTERN_C CONST IID IID_ID2D1SimplifiedGeometrySink;
EXTERN_C CONST IID IID_ID2D1GeometrySink;
EXTERN_C CONST IID IID_ID2D1TessellationSink;
EXTERN_C CONST IID IID_ID2D1PathGeometry;
EXTERN_C CONST IID IID_ID2D1Mesh;
EXTERN_C CONST IID IID_ID2D1Layer;
EXTERN_C CONST IID IID_ID2D1DrawingStateBlock;
EXTERN_C CONST IID IID_ID2D1RenderTarget;
EXTERN_C CONST IID IID_ID2D1BitmapRenderTarget;
EXTERN_C CONST IID IID_ID2D1HwndRenderTarget;
EXTERN_C CONST IID IID_ID2D1DCRenderTarget;
EXTERN_C CONST IID IID_ID2D1Factory;


#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
#pragma endregion

Questo credo definisca bitwise operators per un enum, mai visto prima:
C++:
#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
extern "C++" { \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) | ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) |= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) & ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) &= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator ~ (ENUMTYPE a) throw() { return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) ^= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
}


O ancora, che è questo?!
C++:
/// <summary>
/// The root interface for all resources in D2D.
/// </summary>
interface DX_DECLARE_INTERFACE("2cd90691-12e2-11dc-9fed-001143a055f9") ID2D1Resource  : public IUnknown
{

    /// <summary>
    /// Retrieve the factory associated with this resource.
    /// </summary>
    STDMETHOD_(void, GetFactory)(
        _Outptr_ ID2D1Factory **factory
        ) CONST PURE;
}; // interface ID2D1Resource

Insomma, quello che sto cercando è un libro intermedio/avanzato che mi spieghi tutte queste pattern qui in modo che quando le incontro, sono in grado di riconoscerle come cose ovvie. Dopotutto chi ha scritto questo codice, deve pur aver imparato quelle cose da qualche parte...
Sapete dirmi se questo libro esiste e se si, quale è il suo titolo? :)
 
Ultima modifica:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Ogni volta che apro qualche header scritto da professionisti, mi ritrovo di fronte a patterns che non ho mai visto e non riesco a capire, esempio, qual'è il punto di questo define nel codice sotto? A prima vista sembra quasi inutile, ma sono sicuro che ha uno scopo:
C++:
#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)

Oppure, cosa sta succedendo qui?!

C++:
#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)


EXTERN_C CONST IID IID_ID2D1Resource;
EXTERN_C CONST IID IID_ID2D1Image;
EXTERN_C CONST IID IID_ID2D1Bitmap;
EXTERN_C CONST IID IID_ID2D1GradientStopCollection;
EXTERN_C CONST IID IID_ID2D1Brush;
EXTERN_C CONST IID IID_ID2D1BitmapBrush;
EXTERN_C CONST IID IID_ID2D1SolidColorBrush;
EXTERN_C CONST IID IID_ID2D1LinearGradientBrush;
EXTERN_C CONST IID IID_ID2D1RadialGradientBrush;
EXTERN_C CONST IID IID_ID2D1StrokeStyle;
EXTERN_C CONST IID IID_ID2D1Geometry;
EXTERN_C CONST IID IID_ID2D1RectangleGeometry;
EXTERN_C CONST IID IID_ID2D1RoundedRectangleGeometry;
EXTERN_C CONST IID IID_ID2D1EllipseGeometry;
EXTERN_C CONST IID IID_ID2D1GeometryGroup;
EXTERN_C CONST IID IID_ID2D1TransformedGeometry;
EXTERN_C CONST IID IID_ID2D1SimplifiedGeometrySink;
EXTERN_C CONST IID IID_ID2D1GeometrySink;
EXTERN_C CONST IID IID_ID2D1TessellationSink;
EXTERN_C CONST IID IID_ID2D1PathGeometry;
EXTERN_C CONST IID IID_ID2D1Mesh;
EXTERN_C CONST IID IID_ID2D1Layer;
EXTERN_C CONST IID IID_ID2D1DrawingStateBlock;
EXTERN_C CONST IID IID_ID2D1RenderTarget;
EXTERN_C CONST IID IID_ID2D1BitmapRenderTarget;
EXTERN_C CONST IID IID_ID2D1HwndRenderTarget;
EXTERN_C CONST IID IID_ID2D1DCRenderTarget;
EXTERN_C CONST IID IID_ID2D1Factory;


#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
#pragma endregion

Questo credo definisca bitwise operators per un enum, mai visto prima:
C++:
#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
extern "C++" { \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) | ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) |= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) & ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) &= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator ~ (ENUMTYPE a) throw() { return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a)); } \
inline _ENUM_FLAG_CONSTEXPR ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type &)a) ^= ((_ENUM_FLAG_SIZED_INTEGER<ENUMTYPE>::type)b)); } \
}


O ancora, che è questo?!
C++:
/// <summary>
/// The root interface for all resources in D2D.
/// </summary>
interface DX_DECLARE_INTERFACE("2cd90691-12e2-11dc-9fed-001143a055f9") ID2D1Resource  : public IUnknown
{

    /// <summary>
    /// Retrieve the factory associated with this resource.
    /// </summary>
    STDMETHOD_(void, GetFactory)(
        _Outptr_ ID2D1Factory **factory
        ) CONST PURE;
}; // interface ID2D1Resource

Insomma, quello che sto cercando è un libro intermedio/avanzato che mi spieghi tutte queste pattern qui in modo che quando le incontro, sono in grado di riconoscerle come cose ovvie. Dopotutto chi ha scritto questo codice, deve pur aver imparato quelle cose da qualche parte...
Sapete dirmi se questo libro esiste e se si, quale è il suo titolo? :)

Ma guarda io ti parlo per esperienza, è normale non capire il quadro generale del codice se non si sa il contesto in cui lo si sta usando. Nel senso che si può essere dei guru a programmare in un certo linguaggio prendi per esempio il C, ma comunque resterai sempre stupito dal codice degli altri o anche confuso, prendi per esempio il kernel linux o magari le api di windows, soprattutto le api di windows che non seguono nessuna logica del C, cioè se le reinventano da se. Ripeto non c'è un libro che ti spieghi quello che tu hai chiesto, serve esperienza nel campo. Quello che cerco di dirti è che devi capire il contesto del codice e sperare che quella persona sappia programmare in maniera chiara e circoncisa, molte volte quando si vedono strani pezzi di codice per esempio tipo le dichiarazioni delle funzioni tramite il #define lo si fa per ottimizzare o per aggirare un problema non ancora risolto i famosi "TODO:" soprattutto in ambito c/c++.
Visto che comunque l'ambito riguarda soprattutto le api di windows allora le docs sul loro sito sono la unica guida da seguire.

Non mi scorderò mai l'articolo che lessi tempo fa, dove uno sviluppatore nel gioco aveva degli scoiattoli implementati. Erano animali che facevano parte dell'ambiente circostante, per aggirare un problema di timing si sono inventati di usare gli scoiattoli come temporizzatori del gioco ti rendi conto? ora dimmi se nel guardare il codice saresti mai riuscito a prima vista a dedurre che quegli scoiattoli fossero la clessidra temporale del gioco :asd:

Un altro esempio è il codice sorgente di Doom in C, guardalo e spaventati/meravigliati.
 
Ultima modifica:

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
lol
Quando ho scritto quella domanda nel primo messaggio del topic l'ho ripetuta in altri 2 posti, a quanto pare tutti mi hanno scoraggiato dal provare, ormai credo seguirò il consiglio generale ovvero di non provare a capire il codice leggendo dall'header ma di usare una data Api tramite la documentazione, e il resto lo imparo strada facendo.
Cmq grazie per il link, non è escluso che lo leggo ugualmente :)
 

Andretti60

Utente Èlite
6,440
5,091
Expert C Programming era un po’ la Bibbia con cui siamo cresciuti noi della vecchia guardia, dopo avere finito il manuale Ritchie Kernighan, il manuale che esponevamo con orgoglio sulla scrivania in ufficio, era il nostro distintivo di essere un hacker. Il mio lo ho buttato al riciclaggio poco tempo fa :)
È ovviamente un libro datato, ma il C sia standard che Ansi non è cambiato di una virgola. Aiuta a capire molte astrusità del linguaggio e alla fine ci sono esempi di domande, con relative soluzioni, che possono essere presenti a un colloquio di lavoro. Assieme a storie e aneddoti divertenti.
Ormai tutte le cose di cui parla si trovano su internet, ecco perché il libro è gratuito pure lui. È una lettura piacevole, ma occorre conoscere il linguaggio, non è per principianti.
 
  • Mi piace
Reazioni: Marcus Aseth

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Expert C Programming era un po’ la Bibbia con cui siamo cresciuti noi della vecchia guardia, dopo avere finito il manuale Ritchie Kernighan, il manuale che esponevamo con orgoglio sulla scrivania in ufficio, era il nostro distintivo di essere un hacker. Il mio lo ho buttato al riciclaggio poco tempo fa :)
È ovviamente un libro datato, ma il C sia standard che Ansi non è cambiato di una virgola. Aiuta a capire molte astrusità del linguaggio e alla fine ci sono esempi di domande, con relative soluzioni, che possono essere presenti a un colloquio di lavoro. Assieme a storie e aneddoti divertenti.
Ormai tutte le cose di cui parla si trovano su internet, ecco perché il libro è gratuito pure lui. È una lettura piacevole, ma occorre conoscere il linguaggio, non è per principianti.
Il finale del libro con il colloquio sulle liste circolari è sublime.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!