#c
#c
Вопрос:
Я просто хочу знать разницу, и я уже пробовал поиск в Google.
printf() printf_s()
Ответ №1:
Сегодня я узнал кое-что новое. Я никогда не использовал _s
функции и всегда предполагал, что они являются расширениями, поставляемыми поставщиком, но на самом деле они определены в стандарте языка в приложении K «Интерфейсы проверки границ». Что касается printf_s
:
K.3.5.3.3
printf_s
ФункцияКраткий обзор
1
#define _ _STDC_WANT_LIB_EXT1_ _ 1 #include <stdio.h> int printf_s(const char * restrict format, ...);
Ограничения времени выполнения
2
format
не должен быть нулевым указателем.%n
Спецификатор 394) (измененный или нет с помощью флагов, ширины поля или точности) не должен отображаться в строке, на которую указываетformat
. Любой аргументprintf_s
, соответствующий%s
спецификатору, не должен быть нулевым указателем.3 Если имеет место нарушение ограничений времени выполнения,
printf_s
функция не пытается произвести дальнейший вывод, и не указано, в какой степениprintf_s
был получен вывод до обнаружения нарушения ограничений времени выполнения.Описание
4
printf_s
Функция эквивалентнаprintf
функции, за исключением явных ограничений времени выполнения, перечисленных выше.ВОЗВРАТ
5
printf_s
Функция возвращает количество переданных символов или отрицательное значение, если произошла ошибка вывода, ошибка кодирования или нарушение ограничений времени выполнения.
394)
%n
Появление символов в последовательности в строке, на которую указывает format, не является нарушением ограничений времени выполнения, если эти символы не интерпретируются как%n
спецификатор. Например, если вся строка формата была%%n
.
Подводя итог, printf_s
выполняет дополнительную проверку во время выполнения своих аргументов, не выполненных printf
, и не будет пытаться продолжить, если какая-либо из этих проверок во время выполнения завершится неудачей.
_s
Функции являются необязательными, и компилятор не обязан их поддерживать. Если они поддерживаются, макрос __STDC_WANT_LIB_EXT1__
будет определен равным 1, поэтому, если вы хотите их использовать, вам нужно сделать что-то вроде
#if __STDC_WANT_LIB_EXT1__ == 1
printf_s( "%s", "This is a testn" );
#else
printf( "%s", "This is a testn" );
#endif
Комментарии:
1. «Я … всегда предполагалось, что это расширения, поставляемые поставщиком» Я считаю, что это были расширения, поставляемые поставщиком, в частности, это были проприетарные расширения Microsoft Visual Studio. Но позже им удалось привести их в соответствие со стандартом C.