Почему size_t работает без заголовков в VS 2019 и Clang 9 в Windows?

Еще один вопрос, чем Где мне найти определение size_t? ответы.

#include <iostream> //comment this size_t still works, but std::size_t doesn't work
#include <stdlib.h> //comment this size_t still works

int main(int argc, char* argv[])
{        
    size_t t;
    std::size_t t;
    return 0;
}

В Visual Studio 2019:

Кажется, что определение size_t находится в vcruntime.h

(1) size_t работает даже без заголовка, почему? Может ли система сборки автоматически включать какой-либо заголовок, например vcruntime.h, или это реализовано каким-либо другим механизмом, например встроенными типами?

(2) std :: size_t можно использовать, только если включен iostream, а F12 также переходит к определению в vcruntime.h. Но поиск всего источника времени выполнения MS VC (например, ... \ VC \ Tools \ MSVC \ 14.23.28105), похоже, не дает такого определения, тогда как это происходит?

Теперь я обнаружил, что то же самое происходит и с Clang 9 в Windows.


person jw_    schedule 24.02.2020    source источник
comment
std :: size_t можно использовать, только когда включен iostream Только? Он находится в <cstddef> и / или <cstdlib>.   -  person Nicol Bolas    schedule 24.02.2020
comment
Я имею в виду, почему int компилируется при отсутствии заголовка? Что ж, есть куча загадочных включений по умолчанию, когда вы хотите что-то построить.   -  person ALX23z    schedule 24.02.2020
comment
@ ALX23z Теперь я понял, поскольку size_t - это typedef uint / ulong, а не структура, то это нормально, что с ним происходит какая-то загадка.   -  person jw_    schedule 24.02.2020
comment
@jw_: Нет, в этом нет смысла. size_t является typedef и, следовательно, должен быть определен по типу до его использования. Вы не можете использовать typedef до того, как он действительно получит typedef. int компилируется, потому что это ключевое слово определяется стандартом и предоставляется непосредственно реализацией.   -  person Nicol Bolas    schedule 24.02.2020
comment
@NicolBolas Теперь я искал ‹cstddef› и / или ‹cstdlib›, там используется только _CSTD size_t; под std {}, что означает использование :: std :: size_t; - станет ли использование определением? Думаю, нет.   -  person jw_    schedule 24.02.2020
comment
@jw_: вы можете искать что угодно, но стандарт C ++ требует, чтобы включение одного из этих заголовков означало, что std::size_t будет вам доступен. Каким образом это происходит в реализации, не имеет значения.   -  person Nicol Bolas    schedule 24.02.2020
comment
@NicolBolas Да, это кажется плохим сравнением с ALX23z, но подумайте еще раз, я понимаю, что значение может быть int / long, это обрабатывается специально, тогда typedef int / long не шокирует, если его специально обрабатывает компилятор. Вполне возможно, что компилятор специально обработает size_t.   -  person jw_    schedule 24.02.2020
comment
@NicolBolas В основном не имеет отношения к делу, но это то, о чем был задан вопрос. Я использую Clang libtooling, так что это актуально для меня.   -  person jw_    schedule 24.02.2020
comment
@jw_: Вполне возможно, что компилятор специально обработает size_t. Если это так, это будет деталь реализации, которая ненадежна для всех компиляторов. И поэтому нет смысла полагаться на возможность использовать size_t без включения соответствующего заголовка. А если на это не стоит полагаться ... какая разница, как он работает?   -  person Nicol Bolas    schedule 24.02.2020
comment
пример обозревателя компилятора с msvc, clang, gcc компилируется только msvc, когда нет #includes. Меня это удивляет, но это вполне приемлемый аффикт.   -  person Ryan Haining    schedule 24.02.2020
comment
@NicolBolas Меня беспокоит не использование C ++, а процесс поиска типов во время сборки.   -  person jw_    schedule 24.02.2020
comment
@RyanHaining Clang 9 Windows тоже не сообщает об ошибке. - Это может означать (1) Clang имитировать поведение MSVC в Windows (2) Причина в том, что некоторые файлы заголовков для Windows автоматически включаются вместо встроенных типов - будет ли это делать система сборки?   -  person jw_    schedule 24.02.2020
comment
Так что ответ, похоже, таков, что это встроенный typedef в msvc, а clang-cl эмулирует это. С другой стороны, это разрешено стандартом? Думаю, сложно сказать, может, это не запрещено прямо и поэтому нормально. Разработчики MSVC могли бы удалить его в /permissive- режиме, вероятно, для большей совместимости, но я не уверен, что они это сделают.   -  person Predelnik    schedule 02.06.2021


Ответы (1)


В вашем примере size_t находится в cstdlib.

Поскольку c ++ 17 определен size_t:

in header <cstddef>
in header <cstdio>
in header <cstdlib>
in header <cstring>
in header <ctime>
in header <cuchar>

он может работать без заголовка в vs или других компиляторах. иногда его можно найти с помощью других основных заголовков, таких как ввод-вывод, или даже с помощью std. Но безопасно / лучше включить заголовок.

person sohel14_cse_ju    schedule 24.02.2020
comment
Это в ответах существующего сообщения. - person jw_; 24.02.2020