В дополнении Sourav Ghosh's answer; важным является понятие undefined behavior, что сложно. Обязательно прочитайте блог Lattner: What Every C Programmer Should Know About Undefined Behavior. См. Также this.
Таким образом, оставляя цель (или, возможно, в зависимости от), какое-то неопределенное поведение в вашем коде представляет собой намеренную халатность. Не делай этого. В очень редких случаях вы хотите это сделать (я не вижу их), пожалуйста, задокументируйте это и оправдайте себя некоторыми комментариями.
Имейте в виду, что если на самом деле printf
реализуется с помощью стандартной библиотеки C, это может быть (и часто является), специально обрабатывается компилятором (с GCC и GNU LIBC, что магия мощь происходит с помощью внутренне __builtin_printf
)
C99 & Стандарты C11: частично, определяющие поведение printf
, но оставляют некоторые неопределенные случаи поведения для облегчения реализации. Вы вряд ли полностью поймете или сможете имитировать эти случаи. А сама реализация может измениться (например, на моем Debian Linux, модернизация libc
может изменить неопределенное поведение из printf
)
Если вы хотите, чтобы понять больше printf
изучить исходные некоторую стандартную библиотеку реализации C (например,musl-libc, код которого вполне читаем) и реализации GCC (при условии операционной системы Linux).
Но Сопровождающие ГНУ LIBC и НКА (& даже ядро Linux, через системные вызовы) оставаться свободными, чтобы изменить неопределенной поведения (в printf
и что-нибудь еще)
На практике всегда компилировать с gcc -Wall
(и, вероятно, также -g
) при использовании GCC. Не принимайте никаких предупреждений (так что улучшите свой собственный код, пока не получите его).
«Я намеренно использовать Printf в плохом состоянии» и, таким образом, вы получаете UB, все может случиться. – Deduplicator
@Deduplicator Правильно, но мне нужно перекодировать функцию, которая воспроизводит поведение printf – Sadek
Вам нужно реализовать неопределенное поведение printf или просто определенное поведение? Надеюсь, только определенное поведение. (Если нет, у вас есть невыполнимая задача, потому что различные реализации printf реализуют неопределенное поведение по-разному, что вы будете имитировать?) В этом случае проблема (которую я надеюсь, вам не нужно беспокоиться) что флаг '0' следует спецификатору ширины' * '. –