объекты. В общем, проще выбрать один API и придерживаться его, и основная мотивация заключается в том, хотите ли вы буферизации и хотите ли вы, например, используйте карты памяти или файлы статистики.

у, что все эти 3 функции связаны с открытием файла.

открытый:

Эта функция POSIX устарела. Вместо этого используйте совместимый с ISO C ++ _open.

_открытый:

Открывает файл. Эти функции устарели, потому что доступны более безопасные версии; смотрите _sopen_s, _wsopen_s.

Еореп:

Открывает файл. Доступны более безопасные версии этих функций, которые выполняют дополнительную проверку параметров и возвращают коды ошибок; см. fopen_s, _wfopen_s.

Итак, почему их три? Когда использовать что? Я думал, что POSIX это хорошо, но почему MSDN говорит, что версия POSIXopen не рекомендуется? И есть лисоглашение об именовании связано с лидирующим подчеркиванием, чтобы я мог выбрать правильную функцию, основываясь на ее первом взгляде?

И когда я смотрю вКод ACPICAВижу код ниже: похоже_XXX версия может отключить некоторыеРасширения языка MSчто именно эти расширения?

/*
 * Map low I/O functions for MS. This allows us to disable MS language
 * extensions for maximum portability.
 */
#define open            _open
#define read            _read
#define write           _write
#define close           _close
#define stat            _stat
#define fstat           _fstat
#define mkdir           _mkdir
#define snprintf        _snprintf
#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
#define vsnprintf       _vsnprintf
#endif
#define O_RDONLY        _O_RDONLY
#define O_BINARY        _O_BINARY
#define O_CREAT         _O_CREAT
#define O_WRONLY        _O_WRONLY
#define O_TRUNC         _O_TRUNC
#define S_IREAD         _S_IREAD
#define S_IWRITE        _S_IWRITE
#define S_IFDIR         _S_IFDIR
ДОБАВИТЬ 1

Кажется, префикс подчеркивания_XXX это соглашение Microsoft. Такие как_DEBUG, _CrtSetDbgFlagи вышеупомянутое_открытый, Некоторая цитата изMSDN:

В Microsoft C ++ идентификаторы с двумя ведущими символами подчеркивания зарезервированы для реализаций компилятора. Поэтому соглашение Microsoft должно ставить перед ключевыми словами Microsoft двойные подчеркивания. Эти слова не могут быть использованы в качестве имен идентификаторов.

Расширения Microsoft включены по умолчанию. Чтобы гарантировать, что ваши программы полностью переносимы, вы можете отключить расширения Microsoft, указав параметр командной строки ANSI-совместимый / Za (скомпилировать для совместимости с ANSI) во время компиляции. Когда вы делаете это, специфичные для Microsoft ключевые слова отключаются.

Когда расширения Microsoft включены, вы можете использовать ключевые слова Microsoft в своих программах. Для соответствия ANSI эти ключевые слова предваряютсядвойное подчеркивание, Для обратной совместимости,одного подчеркивание поддерживаются версии всех ключевых слов с двойным подчеркиванием, кроме __except, __finally, __leave и __try. Кроме того, __cdecl доступен без подчеркивания.

Ключевое слово __asm заменяет синтаксис C ++ asm. asm зарезервирован для совместимости с другими реализациями C ++, но не реализован. Используйте __asm.

Ключевое слово __based имеет ограниченное применение для 32-битных и 64-битных целевых компиляций.

Хотя согласно приведенной выше цитате,__int64 а также_int64 оба должны работать, но Visual Studio НЕ обеспечивает подсветку синтаксиса для_int64, Но_int64 тоже могу скомпилировать.

ДОБАВИТЬ 2

snprintf () и _snprintf ()

Ответы на вопрос(0)

Ваш ответ на вопрос