Cabecera <stddef.h>
.
Según la documentación que podemos consultar en cppreference, la cabecera <stddef.h>
aporta lo siguiente:
Antes de C11:
size_t
: alias de tipo (typedef
) a un tipo integral sin signo. Se usa como retorno del operador sizeof
.
ptrdiff_t
alias de tipo (typedef
) a un tipo integral con signo. Se usa como resultado de aritmética de punteros.
NULL
una constante definida como macro cuyo valor es dependiente de implementación y es el valor de un puntero nulo.
offsetof
función macro que calcula el desplazamiento entre el inicio de una estructura y un miembro de dicha estructura.
Después de C11 adicionalmente aporta:
Diferencias entre cabeceras c y cabeceras c++.
C++ adapta muchas de las librerías de C a su propia idiosincrasia, clasificando funciones en espacios de nombres o transformando algunas funciones en plantillas, cuando una librería de C ha sido adaptada a C++ su archivo recibe una c
como prefijo y se le elimina la extensión. Deberías utilizar la cabecera específica de cada lenguaje, por lo que si estás programando en C++ en lugar de usar <stddef.h>
deberías usar <cstddef>
, lee este hilo para saber más sobre este tema.
Al utilizar punteros utilizo muchas veces el NULL.
Pero resulta que si quito esa inclusión el programa funciona correctamente de todos modos. Como si la librería stdio.h
ya me aportase la constante de NULL
igualmente.
¿Que creen que puede ser?
Las cabeceras pueden incluir otras cabeceras. Otras de las cabeceras que estés usando podrían incluir <stddef.h>
y por ello estarías recibiendo NULL
. Por ejemplo si consultamos la implementación de GCC de <stdio.h>
, vemos que una de las primeras cosas que hace es, efectivamente, incluir <stddef.h>
:
/*
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* @(#)stdio.h 5.3 (Berkeley) 3/15/86
*/
/*
* NB: to fit things in six character monocase externals, the
* stdio code uses the prefix `__s' for stdio objects, typically
* followed by a three-character attempt at a mnemonic.
*/
#ifndef _STDIO_H_
#ifdef __cplusplus
extern "C" {
#endif
#define _STDIO_H_
#define _FSTDIO /* ``function stdio'' */
#define __need_size_t
#include <stddef.h>