Dado que esta respuesta aún se vota, quiero señalar que casi nunca debería tener que buscar en los archivos de encabezado. Si desea escribir un código confiable, lo mejor será que consulte el estándar. Una pregunta mejor que "cómo se define off_t
en mi máquina" es "¿cómo se define el estándar off_t
?". Seguir el estándar significa que su código funcionará hoy y mañana, en cualquier máquina.
En este caso, off_t
no está definido por el estándar C. Es parte del estándar POSIX, que es you can browse here.
Desafortunadamente, off_t
no está definido muy rigurosamente. Todo lo que podía encontrar para definirla es en la página en sys/types.h
:
blkcnt_t
y off_t
será firmada tipos enteros.
Esto significa que no puede estar seguro de lo grande que es. Si está utilizando GNU C, puede usar las instrucciones en the answer below para asegurarse de que sean 64 bits. O mejor, puede convertir a un tamaño estándar definido antes de ponerlo en el cable. Así es como funcionan proyectos como el Protocol Buffers de Google (aunque se trata de un proyecto de C++).
Por lo tanto, yo pienso "¿dónde puedo encontrar la definición en mis archivos de cabecera" no es la mejor pregunta. Pero, para lo completo aquí está la respuesta:
Encontrará la definición de bits/types.h
(como dice un comentario en la parte superior, nunca incluya directamente este archivo), pero es un poco oscurecida en un montón de macros. Una alternativa a tratar de desentrañar ellos es mirar a la salida del preprocesador:
#include <stdio.h>
#include <sys/types.h>
int main(void) {
off_t blah;
return 0;
}
Y luego:
$ gcc -E sizes.c | grep __off_t
typedef long int __off_t;
....
Sin embargo, si usted quiere saber el tamaño de algo, siempre se puede utilizar el sizeof()
operador.
Editar: Acabo de ver la parte de tu pregunta sobre el __
. This answer has a good discussion. El punto clave es que los nombres que comienzan con __
están reservados para la implementación (por lo que no debe iniciar sus propias definiciones con __
).
Todo lo que empiece por '__' está reservado para el uso por implementación (a menos que el estándar defina un significado para él, como en '__func__' o' __FILE__'). El nivel de indirección permite que la implementación defina su propio tipo '__off_t' sin interferir con cualquier cosa que legítimamente pueda hacer. Los bits específicos de la plataforma de los encabezados pueden ocultarse mejor (por lo que una copia única del código fuente puede manejar compilaciones de 32 y 64 bits en una sola máquina, por ejemplo). Leer encabezados estándar es una tarea importante porque hay tantas definiciones interrelacionadas. –