Se preferisci "T * var", scrivi mai "T *"? [duplicare]

12

Pensando a dove inseriamo i nostri asterischi ; come fanno coloro che preferiscono mantenere il "pointerness" lontano dal tipo e con l'identificatore ( int * i ) scrivono il codice quando manca l'identificativo?

void f(int*); // 1
void f(int *); // 2

Il primo sembra molto più comune, non importa quale sia la vostra preferenza quando con l'identificatore. Questo è un caso speciale? Cosa lo rende un'eccezione?

Tuttavia, il primo non è ancora universale, perché ho visto il secondo stile. Oltre alla coerenza sulla falsariga di "c'è sempre uno spazio con l'identificatore, quindi ne abbiamo uno senza", ci sono altri motivi per preferirlo?

Che dire di cast o di array e tipi di funzione? Come scriveresti di nuovo:

(void*)var /*or*/ (void *)var

int[3] /*or*/ int [3]
// more relevant in C++ than C: Example<int[3]>

void(int) /*or*/ void (int)
// more relevant in C++ than C: std::function<void(int)>

Gli ultimi due sarebbero usati raramente, se mai, in C, ma sono visti con i modelli C ++.

    
posta Community 27.09.2010 - 12:02
fonte

4 risposte

15

L'obiettivo dovrebbe essere quello di rendere il codice leggibile e chiaro. Lo stile int* a; può sembrare soddisfacente, ma quando diventa int* a, b; implica qualcosa di diverso da ciò che è realmente. Contrasto con int *a, b; e int *a, *b; dove ognuno legge esattamente come funziona.

La differenza tra void f(int*); e void f(int *); per la leggibilità è trascurabile, e non riesco a trovare molta cura di quale viene utilizzato.

Quando ricordi l'obiettivo di livello superiore (leggibilità) è più facile separare i nitpick puri da potenziali problemi di comprensione / manutenzione.

    
risposta data 14.12.2010 - 20:16
fonte
6

Ho sempre separato la stella dal tipo, quindi uso:

void f(int *);

void f(int *x)
{
    char *y = (char *) x;
    char x[4];
}

Ovviamente, non separo le parentesi dall'identificatore.

È così che ho imparato a farlo da K & R, e chi sono io per discutere? (Inoltre, sembra essere il modo più leggibile.)

    
risposta data 27.09.2010 - 17:19
fonte
2

NON si tratta assolutamente di stile, leggibilità, manutenibilità o qualsiasi aspetto estetico.

La sintassi di C, e quindi anche C ++, lo richiedono.

Ecco un esempio:

int *a, *b, *c;

Questo rende tre indicatori.

Tuttavia:

int* a, b, c;

Questo crea un puntatore e due inte

    
risposta data 03.02.2013 - 09:13
fonte
1

Se non diversamente specificato diversamente, tendo a seguire il paradigma C per cose del genere; vale a dire, T * , T [N] , T (*)() , ecc., sia che io stia scrivendo C o C ++, perché pointer-ness e array-ness e function-ness sono tutte funzioni del dichiaratore, non dello specificatore di tipo.

Tuttavia, seguirò il paradigma comune per la lingua data quando dichiaro gli oggetti:

T* foo; // C++
T *bar; // C

Questa è un'incongruenza nel mio stile di codifica? Sì. È un grosso problema? Non fino a quando qualcuno non si lamenta per questo.

    
risposta data 04.04.2012 - 16:47
fonte

Leggi altre domande sui tag