Comdiv писал(а):
vlad писал(а):
Единственное исключение - вызов функции без прототипа, который специфичен только для С (не С++) и "правило" для которого описано ниже.
Это не единственное ограничение. Во-первых, в самом Си -файле можно наобъявлять что угодно и привести к чему угодно и вызвать что заблагорассудиться,
Зачем? Любое злоупотребление имеет смысл и совершается только тогда, когда правильный способ неочевиден или неудобен (больше букв писать, грубо говоря). "Наобъявлять и вызывать" конечно можно, но тупо написать #include и очевиднее и удобнее и правильнее.
Так же как в обероне можно сделать IMPORT SYSTEM и начать калечить память - зачем?
Comdiv писал(а):
во-вторых, люди часто злоупотребляют грубой работой с памятью, чему способствует знание содержания Си файла и расчёт на то, что это не случайная особенность текущего состояния реализации.
Такая проблема есть, но существующие возможные подходы к инкапсуляции потрохов в С вообще никак не покрыты обсуждаемыми правилами. Кроме весьма неоднозначного (бредового) предложения работать с хедерами и объектными файлами...
Цитата:
Оно и с #include не гарантирует целостности, но include даёт компилятору больше возможности проверки соответствия интерфейса и реализации.
Ну я так и написал в своей редакции правил
Но понять что значит в оригинале "контоль целостности" сложно, а звучит страшно.
Цитата:
Цитата:
Цитата:
• Прототипы функций можно использовать только в header-файлах. (Это правило необходимо, поскольку язык Си не имеет механизма проверки того, что функция реализуется в том же модуле, что и ее прототип; так что использование прототипа может маскировать ошибку «отсутствия функции» — «missing function»).
Бред 100%. Но можете попробовать переформулировать.
Не бред и даже не знаю, нужно ли это переформулировать, чтобы Вам угодить. Можно, конечно, уточнить, что автор забыл о возможности косвенной рекурсии.
Я так и не понял, какую проблему имел ввиду автор даже после твоего пояснения. Использования прототипов для неэкспортируемых функций внутри .с/.cpp обычная практика... Рекурсивный вызов только пример того, когда это неообходимо больше всего.
Цитата:
Цитата:
Цитата:
• Любая глобальная переменная в модуле, и любая функция, кроме той, что импортируется через header-файл, должны быть объявлены статическими.
Специфично для C. Для С++ для этого есть анонимный namespace. Опять же, что будет если не следовать этому правилу не поясняется. Потеря целостности?
На самом деле или ничего не будет или будет ошибка линковки.
Если в N Си-файлах окажутся переменные с одним именем, где >=N-1 объявлений будут без инициализаторов, то в конечной программе будет объявлена только одна переменная без ошибок связывания. В больших программах это не такая уж невозможная ситуация, сталкивался. Если есть возможность, то может помочь опция -flto.
Видимо это особенность твоего компилятора. Мои всегда ругались на mutiple instances или че-то такое. Впрочем я это тоже отразил в моей редакции правил...
Цитата:
И так далее. Пока надоело писать.
Я вообще не понимаю, чего вы вступились за эти правила. Сформулированы откровенно хреново, с упором на критику, а не на понимание "как надо". Попробуй сравнить с моими и сказать, что в моих не хватает. При том, что мои короче в несколько раз и без истерик про целостность.
Ну и нагуглить можно что-то более подробное и адекватное, вот самая первая ссылка:
http://umich.edu/~eecs381/handouts/CHea ... elines.pdf