C: Почему size_t не является ключевым словом C?

У вас работает какая-нибудь вставка?

А «сбой» - плохая формулировка. Какое сообщение об ошибке вы получаете?

Этот код прекрасно работает для меня:

    Dim MyReader As New OleDb.OleDbDataAdapter("SELECT * from tblHotels2", _
                                               "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test2\test44.accdb")

    Dim cmdUpate As New OleDbCommandBuilder(MyReader)

    Dim rst As New DataTable()
    MyReader.Fill(rst)
    With rst.Rows.Add()
        .Item("HotelName") = "My Company"
    End With

    MyReader.Update(rst)
26
задан n611x007 27 May 2013 в 14:38
поделиться

10 ответов

Она не возвращает буквально значение типа size_t, так как size_t не является конкретным введите сам по себе, а скорее typedef для неопределенного встроенного типа. Идентификаторы Typedef (например, size_t) полностью эквивалентны соответствующим базовым типам (и преобразуются в них во время компиляции). Если size_t определен как unsigned int на вашей платформе, то sizeof возвращает unsigned int, когда он компилируется в вашей системе. size_t - это просто удобный способ сохранить переносимость, и его нужно включать в stddef.h, только если вы используете его явно по имени.

45
ответ дан Simon Broadhead 28 November 2019 в 06:11
поделиться

sizeof - это ключевое слово, поскольку, несмотря на название и использование, оно является оператором как + или = или < вместо функции подобно printf () или atoi () или fgets () . Многие люди забывают (или просто не знают), что sizeof на самом деле является оператором и всегда всегда разрешается во время компиляции, а не во время выполнения.

C язык не нуждается в size_t , чтобы быть пригодным для использования, согласованным языком. Это только часть стандартной библиотеки. Язык Си нуждается во всех операторах. Если бы вместо + C использовал ключевое слово плюс для добавления чисел, вы бы сделали его оператором.

Кроме того, Я делаю полуявное преобразование size_t s в unsigned int s (и регулярных int s, но Керниган и Ричи когда-нибудь поразят меня за это) все время. Вы можете присвоить тип возвращаемого значения sizeof для int, если хотите, но в своей работе я обычно просто передаю его прямо в malloc () или что-то в этом роде.

14
ответ дан Chris Lutz 28 November 2019 в 06:11
поделиться

Некоторые заголовки из стандарта C определены для автономной среды , т.е. пригодны для использования, например в ядре операционной системы. Они не определяют никаких функций, просто определяют и вводят определения.

Это float.h, iso646.h, limit.h, stdarg.h, stdbool.h, stddef.h и stdint.h.

При работе в операционной системе неплохо начинать с этих заголовков. Наличие их делает многие вещи проще в вашем ядре. Особенно пригодится stdint.h (uint32_t и др.).

8
ответ дан DevSolar 28 November 2019 в 06:11
поделиться

Я думаю, что основными причинами того, что size_t не является ключевым словом, являются:

  • есть нет веских причин для этого. Разработчики языков C и C ++ всегда предпочитали, чтобы языковые возможности были реализованы в библиотеке, если это возможно и целесообразно
  • , добавление ключевых слов в язык может создать проблемы для существующей части унаследованного кода. Это еще одна причина, по которой они обычно сопротивляются добавлению новых ключевых слов.

Например, при обсуждении следующей основной редакции стандарта C ++ Страуструп сказал следующее: :

C ++ 0x улучшения должны быть сделаны таким образом, чтобы полученный язык был легче выучить и использовать. Среди практических правил комитета:

...

  • Предпочитают стандартные библиотечные средства расширениям языков

...

4
ответ дан Michael Burr 28 November 2019 в 06:11
поделиться

Нет причин не включать stddef.h, даже если вы работаете над ядром - он определяет размеры шрифта для вашего конкретного компилятора, который понадобится любому коду.

Также обратите внимание, что почти все компиляторы C являются самоскомпилированными. Поэтому фактический код компилятора для оператора sizeof будет использовать size_t и ссылаться на тот же файл stddef.h, что и код пользователя.

3
ответ дан 28 November 2019 в 06:11
поделиться

Из MSDN :

Когда применяется оператор sizeof объекту типа char он возвращает 1

Даже если у вас нет доступного / включенного stddef.h и вы не знаете о size_t, с помощью sizeof вы можете получить размер объектов относительно char.

2
ответ дан schnaader 28 November 2019 в 06:11
поделиться

size_t на самом деле является типом - часто без знака int. Sizeof это оператор, который дает размер типа. Тип, возвращаемый sizeof, на самом деле зависит от реализации, а не от языка Си. Это просто целое число.

Редактировать: Чтобы быть очень понятным, вам не нужен тип size_t для использования sizeof. Я думаю, что вы ищете ответ - да, это противоречиво. Однако, это не имеет значения. Вы все еще можете практически правильно использовать sizeof, не имея определения size_t из заголовочного файла.

2
ответ дан Anthony 28 November 2019 в 06:11
поделиться

size_t не является ключевым словом по необходимости. Различные архитектуры часто имеют разные размеры для целочисленных типов. Например, 64-битная машина, скорее всего, будет иметь unsigned long long как size_t , если они не решили сделать int 64-битным типом данных.

Если вы сделаете размер встроенного типа для компилятора, то это отнимет у вас возможности выполнять кросс-компиляцию.

Кроме того, sizeof больше похож на магический макрос времени компиляции (например, шаблон c ++), который объясняет, почему это ключевое слово вместо определенного типа.

1
ответ дан Unknown 28 November 2019 в 06:11
поделиться

Простая причина в том, что это не фундаментальный тип. Если вы посмотрите стандарт C, вы обнаружите, что основные типы включают int , char и т. Д., Но не size_t . Почему так? Как уже указывали другие, size_t является специфичным для реализации типом (т. Е. Типом, способным содержать размер в количестве «байтов C» любого объекта).

С другой стороны, sizeof является (унарным) оператором. Все операторы являются ключевыми словами.

1
ответ дан dirkgently 28 November 2019 в 06:11
поделиться

разве это не означает какую-то проблему в стандартной спецификации C?

Посмотрите на разницу между размещенной реализацией C и автономной реализацией C. Отдельно стоящая (C99) реализация должна обеспечивать заголовки:

Эти заголовки вообще не определяют никаких функций. Они определяют части языка, которые в некоторой степени зависят от компилятора (например,

8
ответ дан Jonathan Leffler 28 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: