Как работает size_t и __w64, time_t и __int64?

Я не ветеран в C или C ++. Я не знаю какtime_t определяется и разработан.
Несколько постов вроде:

Но эти посты только утверждают, что time_t или же size_t, В нем не было четко указано, как и где определены и объявлены time_t или size_t.

я использую WIN8 VS2012 Express C ++. Я искал в библиотеке и обнаружил, что size_t определяется в crtdefs.h вместо cstddef,

  • Зачем нужны такие типы, как size_t, time_t? Мы можем позволить sizeof просто вернись unsigned int,
  • Почему библиотека C ++ не определяет size_t?
  • Могу ли я сказать, что size_t НЕ встроенный тип C / C ++?
  • Мне никогда не нужно включать соответствующий файл заголовка в моей программе, чтобы использовать size_t или же time_t(может быть, они определены в std Пространство имен).

Я снова искал в библиотеке, и нашел size_t определяется как typedef _W64 unsigned int size_t, а также _W64 определяется как __w64, Здесь, я не могу искать больше о том, где находится __w64 определяется или объявляется.

  • Что такое __w64 тип? Это не указано в стандарте C ++ 11 / C99.

Точно так же, когда я искал time_t, Я нашел __int6, Но не знает где __int64 происходит от.

3

Решение

__w64 это специфичное для Microsoft расширение, которое «включает предупреждения при компиляции с / Wp64» — оно используется для определения кода, который «опасен», если вы пытаетесь скомпилировать его для 64-битной версии — например, для присвоения 32-битной переменной 32 один бит. например.:

size_t s;
...
unsigned int i;

...
i = s;    // 32 bit can't take all 64 bit values - possible problem.

Определение size_t а также time_t являются typedef ... size_t; а также typedef ... time_t; — они не «исправлены» в компиляторе. Стандарт просто говорит, что они должны быть там (и подходить для системы, на которую ориентирован компилятор). Я думаю, вы найдете это cstddef включает в себя crtdefs.h в том или ином месте.

__int64 тип компилятора Microsoft Это определяется самим компилятором. Затем его можно использовать для определения других «типоразмеров», таких как time_t или же size_t (с подходящим unsigned по мере необходимости). Другие компиляторы могут не иметь этого типа, но будет НЕКОТОРЫЙ способ определить 8, 16, 32 и 64-битное целое число. Фактическое происхождение __int64 вероятно, до возникновения long long, который долгое время (каламбур) не поддерживался Microsoft. Я верю, что это сейчас.

1

Другие решения

C / C ++ имеет наследие более 20 лет, и теперь оно реализовано на более чем 100 различных архитектурах.

На самом деле, некоторые из них действительно отличаются от x86. На некоторых из них целочисленные регистры 16-разрядные, а адресное пространство и адресные регистры 32-разрядные. У меня есть опыт написания в этих условиях.

Да, в этом случае int/unsigned int 16 бит, и это имеет смысл, в то время как указатель и size_t 32 бит. На х86 это не так, но хорошо …

Это ответ.

size_t НЕ является встроенным типом C / C ++?

Истинный ответ — да и нет. Теоретически, вы можете написать свои собственные заголовочные файлы, такие как crtdefs.h, И пиши там что хочешь. Компилятор скорее всего будет работать. Но это много работы. Никто не делает это. Как только системные заголовочные файлы станут частью компилятора, тогда size_t построен в ….

0

По вопросам рекламы [email protected]