In this SO question ho incontrato un molto stranotypedef
:Come è possibile questo typedef?
struct Date {
int day, month, year;
} typedef date_s;
Ho sempre stato vedere typedef
s seguendo questa 'regola':
typedef <existing> <new>;
Ad esempio:
typedef unsigned long long ull;
typedef int kph; // speed
typedef void (*alpm_cb_log)(alpm_loglevel_t, const char *, va_list);
typedef int int_t;
typedef char char_t, *char_p, (*fp)(void);
Il 4 ° è tratto da here, il 5 e 6 sono da cppreference
E this è come vorrei typedef
un struct
:
typedef struct {
int a, b, c;
} data;
// and then use it
data Something;
La domanda è come è questo anche possibile scrivere tale typedef
? Non ha nemmeno senso (almeno per me).
clang
non fornisce alcun errore o avviso, anche con -Wall -Wextra
.
Domanda bonus: dovrei consigliare l'autore della domanda in cui questo codice è stato trovato di evitare l'uso tale typedef
(perché è molto insolito e può portare a confusione)?
Va bene, anche se insolito. Proprio come int const i; –
@piling Mi piace 'int const i' molto più di' const int i'. È meno confuso quando si lavora con i puntatori, dal momento che si deve solo seguire una regola generale: "Qualunque cosa precede const è const". 'int const * i;' è molto più conciso di 'const int * i;'. – Leandros
La regola attuale è che è la stessa cosa che dichiarare una variabile, ma mettere "typedef' (quasi) ovunque lo rende dichiarando un alias di tipo invece di una variabile. La gente di solito la mette in primo piano per chiarezza –