Are vreun efect asupra ta un sentiment de sine?

Am întâlnit un cod C ++ care are următoarele:

typedef Request Request;

Este aceasta doar o opțiune sau nu are acest efect efectiv și, dacă da, ce efect are?

0
Acest lucru ar putea face ceva dacă Request a fost o macrocomandă.
adăugat autor Mankarse, sursa
Da, într-adevăr este typedef Request Request , iar solicitarea a fost definită anterior, dar nu este sigur dacă este același spațiu de nume sau nu.
adăugat autor WilliamKF, sursa
Sunteți sigur că nu a fost typedef struct Request Request ?
adăugat autor Graham Borland, sursa
A fost Request definită în același spațiu de nume?
adăugat autor K-ballo, sursa

2 răspunsuri

Puteți citi toate regulile referitoare la specificatorul typedef pentru C ++ 2003 ANSI ISO IEC 14882 2003 din secțiunea 7.1.3. În 7.1.3, 2) sa spus că identitatea typedef este permisă dacă numele se referă deja la un anumit tip.

Acest lucru este legal:

typedef int Request;
typedef Request Request;//Redefines "Request" with no effect 

Și că nu este:

typedef Request Request;//Illegal, first "Request" doesn't name a type. 

Standardul are un exemplu specific în acest sens. C ++ 2003, §7.1.3/2:

Într-un anumit domeniu de aplicare, care nu este clasificat, se poate folosi un specificator typedef pentru a redefini numele oricărui tip declarat în   acest domeniu de aplicare să se refere la tipul la care se referă deja. [ Exemplu :

typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;

- exemplu final ]

În 7.1.3, 3) sa spus că folosirea typedef pentru a redefini tipul la alias unui alt tip este interzisă

0
adăugat
Care este diferența dintre ele? Postarea dvs. nu este destul de clară, deoarece văd de două ori același tip, dar unul dintre ele este legal, altul nu este.
adăugat autor Nawaz, sursa
Diferența dintre primul meu bloc și cel de-al doilea bloc este definiția anterioară a "Solicitării".
adăugat autor Robᵩ, sursa

If Request is only passed as a parameter it seems to be a opaque pointer.
There should be a

typedef struct Request Request 

undeva în cod. (a se vedea comentariile la întrebarea dvs.)
Acesta este folosit pentru a defini un API și pentru a ascunde detaliile implementării. Deci, puteți schimba ulterior implementarea fără a modifica din nou API-ul.

Clientul nu are nevoie să știe nimic despre tipul acutal - un fel de mâner Tot ce vrei să faci cu el trebuie făcut cu metodele api (crearea, ștergerea, încărcarea, init, ...)
De obicei, mânerul Request va fi turnat la ceva mai semnificativ în implementarea API. Aceasta a fost/este de obicei făcută în vechi C.

0
adăugat
Aceasta este întrebarea C ++. Spre deosebire de C, în C ++, numele structurii numește automat tipul, deci nu sunt sigur de ce ai avea typedef struct Request Request oriunde. Ca declarație în avans ar fi suficient să existe struct Request; . Sau lipsesc ceva aici?
adăugat autor hyde, sursa