Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x5010h: Prohibición de directivas #pragma no estándar o privativas

Compilacion, preprocesador y seguridad (0x50XX)

Universidad Nacional de Río Negro

0x5010h: Prohibición de directivas #pragma no estándar o privativas

Enunciado normativo

NO DEBEN usarse directivas #pragma específicas de un compilador (#pragma warning, #pragma comment de MSVC) ni extensiones privativas. Las advertencias y opciones se configuran con banderas estándar (-Wall, ...).

¿Por qué existe esta regla?

El problema

El estándar ISO C define #pragma como una vía de escape para la implementación: su contenido es libre y cada compilador decide qué reconoce. Un #pragma desconocido se ignora silenciosamente, de modo que el código parece compilar pero la intención no se cumple. #pragma warning(disable: 4996) silencia una advertencia en MSVC, pero en GCC no hace absolutamente nada; el programa queda con el mismo defecto y la falsa sensación de estar «arreglado».

Peor aún, algunas directivas atan el código a una plataforma: #pragma comment(lib, "ws2_32") pide una biblioteca por nombre, algo que sólo entiende el enlazador de MSVC. El proyecto deja de compilar en Linux.

Consecuencias de violarla

Tipo de consecuenciaEfecto concreto
PortabilidadLa directiva se ignora o rompe en GCC/Clang.
Bug silenciosoEl #pragma desconocido no avisa: la intención no se ejecuta.
Compilaciónunknown pragma con -Wunknown-pragmas (incluida en -Wall).
MantenibilidadOculta la verdadera configuración del proyecto en el código.

Fundamento en el estándar y en la cátedra

ISO/IEC 9899:2011 §6.10.6 define #pragma: «cada implementación puede reconocer distintas directivas»; las no reconocidas se ignoran. La cátedra exige que la configuración viva en el Makefile porque es ahí donde el corrector automático la revisa, y porque el código debe compilar en GCC y Clang sin cambios.

Alcance y excepciones

Aplica a todo #pragma privativo. Excepción limitada: las directivas estandarizadas de control de diagnóstico de GCC/Clang (#pragma GCC diagnostic push/pop) pueden usarse en el código propio para aislar una advertencia de una biblioteca de terceros, documentando por qué. #pragma once no es ISO C: se prefiere la guarda de inclusión (0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera).

Ejemplos exhaustivos

❌ Contraejemplo 1 — Silenciar una advertencia de MSVC

#pragma warning(disable: 4996)

#include <stdio.h>

int main(void)
{
    char buf[16];
    gets(buf);
    return 0;
}

Por qué falla: en GCC la directiva se ignora (con -Wall avisa unknown pragma), así que gets no queda habilitada de forma segura; además gets no existe en C11. El #pragma sólo consigue que el código dependa de MSVC.

❌ Contraejemplo 2 — Enlazar una biblioteca con #pragma comment

#pragma comment(lib, "ws2_32.lib")

#include <stdio.h>

int main(void)
{
    printf("hola\n");
    return 0;
}

Por qué falla: #pragma comment es una extensión de MSVC para el enlazador. GCC no la reconoce y el enlace debe resolverse con -lws2_32 en el Makefile; la directiva no hace nada y confunde a quien lee el código.

✅ Ejemplo conforme 1 — Configuración con banderas

CC     = gcc
CFLAGS = -std=c11 -Wall -Wextra -Werror -pedantic
app: main.c
	$(CC) $(CFLAGS) main.c -o app

Las advertencias y el nivel de exigencia quedan en CFLAGS, donde la cátedra los revisa. El código fuente no contiene directivas dependientes del compilador.

✅ Ejemplo conforme 2 — Aislar una advertencia puntual de una dependencia

#include "biblioteca_externa.h"

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#include "encabezado_con_ruido.h"
#pragma GCC diagnostic pop

Cuando no queda otra que convivir con advertencias de una cabecera ajena, se acota con push/pop alrededor del #include, se documenta la causa y no se silencia el código propio. Es la única excepción admitida.

⚠️ Casos límite

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cReporta 0x5010h ante #pragma no estándar.
gcc / clanggcc -std=c11 -Wall -Wextra -Werror -pedantic archivo.cwarning: ignoring '#pragma warning' / unknown pragma.

Checklist de autocontrol

Reglas relacionadas