it-swarm-es.com

Si prefiere "T * var", ¿alguna vez escribe "T *"?

Posible duplicado:
int * i; o int * i; o int * i;

Pensando en donde colocamos nuestros asteriscos ; ¿Cómo escriben aquellos que prefieren mantener el "puntero" alejado del tipo y con el identificador ( int * i) cuando falta el identificador?

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

El primero parece mucho más común, sin importar cuál sea su preferencia cuando esté con el identificador. ¿Es este un caso especial? ¿Qué lo convierte en una excepción?

Sin embargo, el primero todavía no es universal, porque he visto el último estilo. Además de la coherencia en la línea de "siempre hay un espacio con el identificador, así que tenemos uno sin", ¿hay otras razones para preferirlo?

¿Qué pasa con los tipos de conversión o matriz y función? ¿Cómo reescribirías estos?

(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)>

Los dos últimos rara vez, o nunca, se usarían en C, pero se ven con las plantillas de C++.

12
Roger Pate

El objetivo debe ser hacer que el código sea legible y claro. El estilo int* a; Puede parecer correcto, pero cuando se convierte en int* a, b; Implica algo diferente de lo que realmente es. Contraste con int *a, b; Y int *a, *b; Donde cada uno se lee exactamente como funciona.

La diferencia entre void f(int*); y void f(int *); para la legibilidad es insignificante, y no me importa mucho cuál se usa.

Cuando recuerda el objetivo de nivel superior (legibilidad), es más fácil separar los detalles puros de los posibles problemas de comprensión/mantenimiento.

15
dwc

Siempre separo la estrella del tipo, así que uso:

void f(int *);

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

Obviamente, no separo los corchetes del identificador.

Así es como aprendí a hacerlo de K&R, y ¿quién soy yo para discutir? (Además, parece ser la forma más legible).

6
mipadi

Definitivamente NO se trata de estilo, legibilidad, facilidad de mantenimiento ni nada estético.

La sintaxis de C, y por lo tanto también C++, lo requiere.

He aquí un ejemplo:

int *a, *b, *c;

Eso hace tres punteros.

Sin embargo:

int* a, b, c;

Eso hace un puntero y dos ints.

2
doug65536

A menos que se indique específicamente lo contrario, tiendo a seguir el paradigma C para cosas como esa; es decir, T *, T [N], T (*)(), etc., ya sea que esté escribiendo en C o C++, porque el puntero, el arreglo y la función son todos funciones del declarador, no del especificador de tipo.

Sin embargo, seguiré el paradigma común para el lenguaje dado al declarar objetos:

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

¿Es esto una inconsistencia en mi estilo de codificación? Si. ¿Es un gran problema? No hasta que alguien se queje de ello.

1
John Bode