Поскольку за этот ответ все еще голосуют, я хочу отметить, что вам почти никогда не нужно заглядывать в заголовочные файлы.Если вы хотите написать надежный код, вам гораздо лучше, если смотреть в стандарт.Лучший вопрос, чем «как определяется off_t
на моей машине», это «как определяется off_t
стандартом?».Следование стандарту означает, что ваш код будет работать сегодня и завтра на любой машине.
В этом случае off_t
не определено стандартом C.Это часть стандарта POSIX, который вы можете просмотреть здесь .
К сожалению, off_t
не очень строго определен.Все, что я мог найти, чтобы определить это, на странице sys/types.h
:
blkcnt_t
и off_t
должны быть целочисленными типами со знаком.
Это означает, что вы не можете быть уверены, насколько он велик.Если вы используете GNU C, вы можете использовать инструкции в ответе ниже , чтобы убедиться, что он 64-битный.Или лучше, вы можете преобразовать в размер, определенный стандартами, прежде чем положить его на провод.Вот как работают такие проекты, как Protocol Buffers от Google (хотя это проект C ++).
Итак, я думаю, "где я могу найти определение в моих заголовочных файлах"?это не лучший вопрос.Но, для полноты, вот ответ:
Вы найдете определение в bits/types.h
(как говорится в комментарии сверху, никогда не включайте этот файл напрямую), но оно немного затенено в куче макросов,Альтернатива попыткам их распутать - посмотреть на вывод препроцессора:
#include <stdio.h>
#include <sys/types.h>
int main(void) {
off_t blah;
return 0;
}
А затем:
$ gcc -E sizes.c | grep __off_t
typedef long int __off_t;
....
Однако, если вы хотите узнать размер чего-либо, вы можетевсегда используйте оператор sizeof()
.
Редактировать: только что увидел часть вашего вопроса о __
. Этот ответ имеет хорошее обсуждение .Ключевым моментом является то, что имена, начинающиеся с __
, зарезервированы для реализации (поэтому вы не должны начинать свои собственные определения с __
).