Regla 0x0015h: Validador de espaciado en listas de argumentos y llamadas a funciones
Sintaxis y formato visual (0x00XX)
0x0015h: Validador de espaciado en listas de argumentos y llamadas a funciones¶
Enunciado normativo¶
En listas de parámetros y de argumentos, toda coma DEBE ir adherida al elemento anterior y seguida por exactamente un espacio:
f(a, b, c).
¿Por qué existe esta regla?¶
El problema¶
La coma es un separador de baja jerarquía visual: si no lleva espacio detrás, el
lector agrupa mal los elementos de la lista; si lleva espacio delante, la coma
parece pertenecer al elemento siguiente y se corta la asociación con el
anterior. El espacio uniforme después de la coma convierte a la lista en una
secuencia regular de bloques y permite contar argumentos de un vistazo, algo
crítico cuando se llama a printf con un formato y varios valores. La regla
concreta la convención general de comas de 0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos al caso específico de
firmas y llamadas.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Legibilidad | Listas apretadas (f(a,b,c)) o con espacio previo (f(a , b)) se leen como bloques irregulares. |
| Bug silencioso | Al contar argumentos de printf es fácil equivocarse y pasar un tipo incorrecto. |
| Consistencia | Firmas y llamadas del mismo archivo usan criterios distintos. |
| Revisión | gaff la corrige automáticamente; dejarla es desprolijidad. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 §6.9.1 (Function definitions) y §6.5.2.2 (Function calls) definen la gramática de las listas; el espacio no es significativo más que para separar tokens. Por eso la norma es convencional. La cátedra la adopta para uniformar firmas, prototipos y llamadas, y la articula con 0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos (coma seguida de un espacio), 0x000Ah: Prohibición de espacios en blanco antes de separadores de sintaxis (; y ,) (nada de espacio antes de la coma) y 0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’ (nada de espacio interno en los paréntesis).
Alcance y excepciones¶
Aplica a listas de parámetros de definiciones y prototipos, a listas de
argumentos en llamadas, y a listas de inicialización de agregados. No aplica
a las comas dentro de literales de cadena ("a, b"), que no son separadores, ni
a las comas del operador de coma en una expresión, que conviene evitar salvo en
la cabecera de un for. Las comas de múltiples declaraciones también se rigen
por esta norma, aunque 0x0002h: Una declaración de variable por línea prohíbe declarar varias variables por
línea.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — Sin espacio después de la coma¶
calcular(x,y,z);
imprimir("total",valor,unidades);Por qué falla: la ausencia de espacio comprime la lista y dificulta distinguir cuántos argumentos recibe la función; también viola 0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos.
❌ Contraejemplo 2 — Espacio antes de la coma¶
calcular(x , y);
static int maximo(int a ,int b);Por qué falla: el espacio delante de la coma despega al separador del elemento que cierra, y viola 0x000Ah: Prohibición de espacios en blanco antes de separadores de sintaxis (; y ,). La segunda línea además mezcla el criterio correcto e incorrecto en una misma firma.
✅ Ejemplo conforme 1 — Llamada canónica¶
calcular(x, y, z);Por qué cumple: cada coma está pegada al argumento previo y seguida de un solo espacio, en línea con 0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos.
✅ Ejemplo conforme 2 — Interacción con firmas y printf¶
static int maximo(int a, int b, int c)
{
int mayor = a;
if (b > mayor) {
mayor = b;
}
if (c > mayor) {
mayor = c;
}
return mayor;
}
int main(void)
{
printf("%d %d %d\n", a, b, maximo(a, b, c));
return 0;
}Por qué cumple: la firma y las llamadas comparten el mismo espaciado, no hay
blancos internos junto a los paréntesis (0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’) y el formato de
printf queda legible, lo que ayuda a contar argumentos.
⚠️ Casos límite¶
Comas dentro de cadenas:
printf("a, b")no se toca; no son separadores.Comas de
for:for (i = 0, j = n; ...)también siguen esta regla, aunque la coma allí no separe argumentos.Listas de inicialización:
int v[3] = {1, 2, 3};usa el mismo criterio.Macros variádicas y
...: el último argumento puede no llevar coma; el espaciado previo se mantiene.Coma final en agregados:
{1, 2, 3,}no genera elemento extra ni cambia el espaciado.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Reporta coma sin espacio posterior o con espacio anterior. |
gaff | gaff fix archivo.c | Normaliza el espaciado de todas las listas. |
gcc / clang | gcc -Wall -Wextra -std=c11 -c archivo.c | No reporta: es una regla de estilo. |
Checklist de autocontrol¶
Toda coma está pegada al elemento anterior.
Después de cada coma hay exactamente un espacio.
No confundí comas de cadena con separadores.
Firmas, prototipos y llamadas usan el mismo criterio.
Ejecuté
gaff fixantes de entregar.
Reglas relacionadas¶
0x000Dh: Espacio en blanco obligatorio tras la coma separadora en listas y argumentos — coma separadora seguida de un espacio.
0x000Ah: Prohibición de espacios en blanco antes de separadores de sintaxis (; y ,) — sin espacio antes de
;y,.0x000Eh: Prohibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’ — sin espacios internos en los paréntesis.
0x0011h: Validador de espaciado estricto en sentencias de control — espaciado de las palabras clave de control.
0x0002h: Una declaración de variable por línea — una declaración por línea.