1

Estoy haciendo unas funciones en un programa que ya me lo dan empezado, y veo que tiene en el encabezado:

#include <stddef.h>
#include <stdio.h>

Y no entiendo para qué incluir la libreria stddef.h ya que segun busqué en google lo que aporta la libreria es la constante NULL para las variables tipo punteros (entre otras cosas pero que no utilizo en el programa).

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?

No puedo mostrar codigo y el que me pasó el programa no me puede responder.

eferion
  • 49,291
  • 5
  • 30
  • 72
EnMiPcFunciona
  • 165
  • 1
  • 16

2 Answers2

4

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 y cabeceras .

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>
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

El header sttdef.h define varias definiciones estándar (tipos y macros). Muchas de estas definiciones también aparecen en otros encabezados, por ejemplo, en stdio.h, y es por esto que no ves modificaciones en tu código al no incluir sttdef.h. Este header también define (como lo indican aquí), además del macro NULL, las variables:

typedef ptrdiff_t

typedef size_t

typedef wchar_t

en el enlace que te dejé definen cada variable y también muestran un ejemplo de uso de uno de los macros(offsetof).

Tal vez estén buscando que hagas un uso similar en alguna parte de tu programa, pero si decís que funciona todo, entonces no es necesario incluir el header.

eferion
  • 49,291
  • 5
  • 30
  • 72
Mario L
  • 1,686
  • 1
  • 8
  • 11