У вас работает какая-нибудь вставка?
А «сбой» - плохая формулировка. Какое сообщение об ошибке вы получаете?
Этот код прекрасно работает для меня:
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)
Она не возвращает буквально значение типа size_t, так как size_t не является конкретным введите сам по себе, а скорее typedef для неопределенного встроенного типа. Идентификаторы Typedef (например, size_t) полностью эквивалентны соответствующим базовым типам (и преобразуются в них во время компиляции). Если size_t определен как unsigned int на вашей платформе, то sizeof возвращает unsigned int, когда он компилируется в вашей системе. size_t - это просто удобный способ сохранить переносимость, и его нужно включать в stddef.h, только если вы используете его явно по имени.
sizeof
- это ключевое слово, поскольку, несмотря на название и использование, оно является оператором как +
или =
или <
вместо функции подобно printf ()
или atoi ()
или fgets ()
. Многие люди забывают (или просто не знают), что sizeof
на самом деле является оператором и всегда всегда разрешается во время компиляции, а не во время выполнения.
C язык не нуждается в size_t
, чтобы быть пригодным для использования, согласованным языком. Это только часть стандартной библиотеки. Язык Си нуждается во всех операторах. Если бы вместо +
C использовал ключевое слово плюс
для добавления чисел, вы бы сделали его оператором.
Кроме того, Я делаю полуявное преобразование size_t
s в unsigned int
s (и регулярных int
s, но Керниган и Ричи когда-нибудь поразят меня за это) все время. Вы можете присвоить тип возвращаемого значения sizeof
для int, если хотите, но в своей работе я обычно просто передаю его прямо в malloc ()
или что-то в этом роде.
Некоторые заголовки из стандарта C определены для автономной среды , т.е. пригодны для использования, например в ядре операционной системы. Они не определяют никаких функций, просто определяют и вводят определения.
Это float.h, iso646.h, limit.h, stdarg.h, stdbool.h, stddef.h и stdint.h.
При работе в операционной системе неплохо начинать с этих заголовков. Наличие их делает многие вещи проще в вашем ядре. Особенно пригодится stdint.h (uint32_t и др.).
Я думаю, что основными причинами того, что size_t
не является ключевым словом, являются:
Например, при обсуждении следующей основной редакции стандарта C ++ Страуструп сказал следующее: :
C ++ 0x улучшения должны быть сделаны таким образом, чтобы полученный язык был легче выучить и использовать. Среди практических правил комитета:
...
- Предпочитают стандартные библиотечные средства расширениям языков
...
Нет причин не включать stddef.h, даже если вы работаете над ядром - он определяет размеры шрифта для вашего конкретного компилятора, который понадобится любому коду.
Также обратите внимание, что почти все компиляторы C являются самоскомпилированными. Поэтому фактический код компилятора для оператора sizeof будет использовать size_t и ссылаться на тот же файл stddef.h, что и код пользователя.
Из MSDN :
Когда применяется оператор sizeof объекту типа char он возвращает 1
Даже если у вас нет доступного / включенного stddef.h и вы не знаете о size_t, с помощью sizeof вы можете получить размер объектов относительно char.
size_t на самом деле является типом - часто без знака int. Sizeof это оператор, который дает размер типа. Тип, возвращаемый sizeof, на самом деле зависит от реализации, а не от языка Си. Это просто целое число.
Редактировать: Чтобы быть очень понятным, вам не нужен тип size_t для использования sizeof. Я думаю, что вы ищете ответ - да, это противоречиво. Однако, это не имеет значения. Вы все еще можете практически правильно использовать sizeof, не имея определения size_t из заголовочного файла.
size_t не является ключевым словом по необходимости. Различные архитектуры часто имеют разные размеры для целочисленных типов. Например, 64-битная машина, скорее всего, будет иметь unsigned long long как size_t , если они не решили сделать int 64-битным типом данных.
Если вы сделаете размер встроенного типа для компилятора, то это отнимет у вас возможности выполнять кросс-компиляцию.
Кроме того, sizeof больше похож на магический макрос времени компиляции (например, шаблон c ++), который объясняет, почему это ключевое слово вместо определенного типа.
Простая причина в том, что это не фундаментальный тип. Если вы посмотрите стандарт C, вы обнаружите, что основные типы включают int
, char
и т. Д., Но не size_t
. Почему так? Как уже указывали другие, size_t
является специфичным для реализации типом (т. Е. Типом, способным содержать размер в количестве «байтов C» любого объекта).
С другой стороны, sizeof
является (унарным) оператором. Все операторы являются ключевыми словами.
разве это не означает какую-то проблему в стандартной спецификации C?
Посмотрите на разницу между размещенной реализацией C и автономной реализацией C. Отдельно стоящая (C99) реализация должна обеспечивать заголовки:
Эти заголовки вообще не определяют никаких функций. Они определяют части языка, которые в некоторой степени зависят от компилятора (например,