. Это довольно просто:
Вот рабочая версия вашего кода:
(async function(){
var response = await superagent.get('...')
console.log(response)
})()
ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]
Если вы являетесь эмпирическим типом
echo | gcc -E -xc -include 'stddef.h' - | grep size_t
Вывод для Ubuntu 14.04 64-разрядный GCC 4.8:
typedef long unsigned int size_t;
Обратите внимание, что stddef.h
предоставляется GCC, а не glibc под src/gcc/ginclude/stddef.h
в GCC 4.2.
Интересные появления C99
malloc
принимают size_t
как аргумент, поэтому он определяет максимальный размер, который может быть выделен. И поскольку он также возвращается sizeof
, я думаю, что он ограничивает максимальный размер любого массива. См. Также: Максимальный размер массива в C size_t
- это тип, который может содержать любой индекс массива.
В зависимости от реализации он может быть любым из:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
Вот как size_t
определяется в stddef.h
моей машины:
typedef unsigned long size_t;
size_t или любой неподписанный тип можно рассматривать как переменную цикла, поскольку переменные цикла обычно больше или равны 0.
Когда мы используем объект size_t, мы должны убедиться, что во всех контексты, которые используются, включая арифметику, мы хотим только неотрицательные значения. Например, следующая программа определенно даст неожиданный результат:
// C program to demonstrate that size_t or
// any unsigned int type should be used
// carefully when used in a loop
#include<stdio.h>
int main()
{
const size_t N = 10;
int a[N];
// This is fine
for (size_t n = 0; n < N; ++n)
a[n] = n;
// But reverse cycles are tricky for unsigned
// types as can lead to infinite loop
for (size_t n = N-1; n >= 0; --n)
printf("%d ", a[n]);
}
Output
Infinite loop and then segmentation fault
В manpage для types.h указано:
size_t должен быть целым числом без знака
size_t
и int
не являются взаимозаменяемыми. Например, в 64-разрядной версии Linux size_t
имеется 64-разрядный размер (т. Е. sizeof(void*)
), но int
- 32-разрядный.
Также обратите внимание, что size_t
не имеет знака. Если вам нужна подписанная версия, на некоторых платформах есть ssize_t
, и это будет более актуально для вашего примера.
Как правило, я бы предложил использовать int
для большинства общих случаев и использовать только size_t
/ ssize_t
, когда есть определенная потребность в нем (например, с mmap()
).
size_t
является неподписанным типом. Таким образом, он не может представлять никаких отрицательных значений (& lt; 0). Вы используете его, когда считаете что-то, и уверены, что он не может быть отрицательным. Например, strlen()
возвращает size_t
, поскольку длина строки должна быть не менее 0.
В вашем примере, если ваш индекс цикла будет всегда больше 0, может иметь смысл использовать size_t
или любой другой неподписанный тип данных.
Когда вы используете объект size_t
, вы должны убедиться, что во всех контекстах это используется, включая арифметику, вы хотите неотрицательные значения. Например, предположим, что у вас есть:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
, и вы хотите найти разницу в длинах str2
и str1
. Вы не можете делать:
int diff = s2 - s1; /* bad */
Это связано с тем, что значение, назначенное diff
, всегда будет положительным числом, даже когда s2 < s1
, потому что вычисление выполняется с неподписанными типами. В этом случае, в зависимости от вашего варианта использования, вам может быть лучше использовать int
(или long long
) для s1
и s2
.
В C / POSIX, который мог / должен использовать size_t
, но не из-за исторических причин. Например, второй параметр fgets
в идеале должен быть size_t
, но есть int
.
По моему мнению, size_t
- это целое число unsigned
, размер бита которого достаточно велик, чтобы удерживать указатель на собственную архитектуру.
Итак:
sizeof(size_t) >= sizeof(void*)
В общем, если вы начинаете с 0 и поднимаетесь вверх, всегда используйте неподписанный тип, чтобы избежать переполнения, в результате чего вы попадаете в ситуацию с отрицательным значением. Это критически важно, потому что, если границы вашего массива будут меньше максимального значения вашего цикла, но ваш макс max больше максимального значения вашего типа, вы обернете негатив, и вы можете столкнуться с сегментацией fault (SIGSEGV). Поэтому, вообще говоря, никогда не используйте int для цикла, начинающегося с 0 и идущего вверх. Используйте unsigned.
size_t - целочисленный тип данных без знака. В системах, использующих библиотеку GNU C, это будет unsigned int или unsigned long int. size_t обычно используется для индексирования массива и подсчета циклов.
Поскольку никто еще не упомянул об этом, основным лингвистическим значением size_t
является то, что оператор sizeof
возвращает значение этого типа. Аналогичным образом, основное значение ptrdiff_t
заключается в том, что вычитание одного указателя из другого даст значение этого типа. Функции библиотеки, которые его принимают, делают это, потому что это позволит таким функциям работать с объектами, размер которых превышает UINT_MAX в системах, где такие объекты могут существовать, не заставляя вызывающих абонентов тратить код, передавая значение, большее, чем «unsigned int» в системах, где больший тип было бы достаточно для всех возможных объектов.