Вопросы по С/С++ (СИ)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3705352#p3705352"][uquote="VladislavS",url="/forum/viewtopic.php?p=3705335#p3705335"]мало ли где что я использовать буду.[/uquote]вот это и есть, собственно, фиговая практика.[/uquote]Обоснование будет? Или просто бла-бла?
- Реклама
- Сообщения: 1778
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="FeCat",url="/forum/viewtopic.php?p=3705652#p3705652"]Где идеологически правильнее объявлять и определять объекты которые используются во многих местах?[/uquote]
Объявлять - в хидерах очевидно.
Объявлять - в хидерах очевидно.
[uquote="FeCat",url="/forum/viewtopic.php?p=3705652#p3705652"]Где идеологически правильнее объявлять и определять объекты которые используются во многих местах?[/uquote]определять в своих заголовочниках вестимо. Объявлять - уже поразнообразнее. В целом, как бы это выразить - там, где это более логично в конкретном случае) Скажем, в исходнике, который наиболее интенсивно использует сей объект. Или в том, который структурно является, так скажем, "основным" его потребителем. Или там, где по логике вещей начинается взаимодействие с объектом. Или в отдельном файле.
вообще общая идея - лучше стараться не пихать в исходник того, без чего он соберется. Электронщики любят сооружать один файл с глобальными переменными - ну на то они и электронщики, а не программисты) В крупных проектах наоборот не редкость заголовочники, содержащие исключительно описание одной extern переменной и соответствующие им исходники из двух строчек, ее объявляющие.
[uquote="FeCat",url="/forum/viewtopic.php?p=3705652#p3705652"]какой нибудь стандарт на тему организации структуры программ, актуальный для уровня 1000 - 30000 строк кода.[/uquote]нет какого-нибудь явного стандарта. Общие практики есть, актуальные для любого объема. Основу можно сформулировать как "сооружай из кода отдельные блоки, а не лапшу".
[uquote="VladislavS",url="/forum/viewtopic.php?p=3705662#p3705662"]Обоснование будет?[/uquote]обоснование того, почему сильная связь разнонаправленных участков кода и хаотичное "мали ли где чего" вместо их разделения и изолирования - так себе подход? нет, не будет.
вообще общая идея - лучше стараться не пихать в исходник того, без чего он соберется. Электронщики любят сооружать один файл с глобальными переменными - ну на то они и электронщики, а не программисты) В крупных проектах наоборот не редкость заголовочники, содержащие исключительно описание одной extern переменной и соответствующие им исходники из двух строчек, ее объявляющие.
[uquote="FeCat",url="/forum/viewtopic.php?p=3705652#p3705652"]какой нибудь стандарт на тему организации структуры программ, актуальный для уровня 1000 - 30000 строк кода.[/uquote]нет какого-нибудь явного стандарта. Общие практики есть, актуальные для любого объема. Основу можно сформулировать как "сооружай из кода отдельные блоки, а не лапшу".
[uquote="VladislavS",url="/forum/viewtopic.php?p=3705662#p3705662"]Обоснование будет?[/uquote]обоснование того, почему сильная связь разнонаправленных участков кода и хаотичное "мали ли где чего" вместо их разделения и изолирования - так себе подход? нет, не будет.
имхо, в великом и могучем термины "определять" и "объявлять" вполне могут быть взаимозаменяемыми... что кардинально искажает смысл в контексте программирования.arkhnchul писал(а):определять в своих заголовочниках вестимо. Объявлять - уже поразнообразнее.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:
описание
Код: Выделить всё
extern uin8_t var;
void foo(void);Код: Выделить всё
uint8_t var;
void foo(void){
printf("foo\n");
}Код: Выделить всё
var = 12;
foo();если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV, если Вы видели пример моего заголовочного файла выше, то могли заметить, что описание и реализация у меня всегда совмещены в одной конструкции. А уж в какой объектник попадет "реализация", точнее в каком объектнике будет выделена память и сформирована внешнаяя ссылка для компоновщика на эту память - совершенно не принципиально.
- Реклама
возможно, для С++ это нормально, но для Си - не совсем.ПростоНуб писал(а):описание и реализация у меня всегда совмещены в одной конструкции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3705942#p3705942"]обоснование того, почему сильная связь разнонаправленных участков кода и хаотичное "мали ли где чего" вместо их разделения и изолирования - так себе подход? нет, не будет.[/uquote]Что такое "сильная связь", не знаю такого термина в программировании? Разделены они пространствами имён - ни один модуль другому не мешает в принципе. А возможность пользоваться всеми своими библиотеками, объектами, классами и т.д. в любом месте программы вполне естественна и удобна. Единственное чем я за это плачу - время сборки.
Добавлено after 2 minutes 43 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3705963#p3705963"]
Какая разница то? Вполне нормальный подход и для C, там что #ifdef запретили? Зато всё в одном месте - труднее ошибиться.
Добавлено after 2 minutes 43 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3705963#p3705963"]
возможно, для С++ это нормально, но для Си - не совсем.[/uquote]ПростоНуб писал(а):описание и реализация у меня всегда совмещены в одной конструкции.
Какая разница то? Вполне нормальный подход и для C, там что #ifdef запретили? Зато всё в одном месте - труднее ошибиться.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="ARV",url="/forum/viewtopic.php?p=3705951#p3705951"]имхо, в великом и могучем термины "определять" и "объявлять" вполне могут быть взаимозаменяемыми... что кардинально искажает смысл в контексте программирования.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:[/uquote]
Во всей литературе уже давно определились как переводить declaration и definition - объявлять и определять. Не надо пожалуйста придумывать свою терминологию. Еще больше искажает смысл именно подобное.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:[/uquote]
Во всей литературе уже давно определились как переводить declaration и definition - объявлять и определять. Не надо пожалуйста придумывать свою терминологию. Еще больше искажает смысл именно подобное.
а вот я считаю, что определились не правильно. возможно, какой-то самый первый переводчик в русском языке не разбирался, как следует, и выбрал "буквальный" перевод, ну а остальные просто копипастили... а для русского важен не буквальный, а смысловой перевод. вот сколько лет читаю - столько и не могу привыкнуть. вам проще, если смогли. видимо, тоже не особо загружены знаниями в русском языке...NStorm писал(а):уже давно определились как переводить declaration и definition
ну как бы реализация всегда является и описанием в Си, т.е. если в заголовок включить реализацию функции, например, а потом этот заголовок включить в несколько разных исходников, линкеру это не понравится. то же самое с переменными.VladislavS писал(а):Какая разница то?
и никакие #ifdef не помогут
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="ARV",url="/forum/viewtopic.php?p=3705979#p3705979"]а вот я считаю, что определились не правильно. возможно, какой-то самый первый переводчик в русском языке не разбирался, как следует, и выбрал "буквальный" перевод, ну а остальные просто копипастили... а для русского важен не буквальный, а смысловой перевод. вот сколько лет читаю - столько и не могу привыкнуть. вам проще, если смогли. видимо, тоже не особо загружены знаниями в русском языке.[/uquote]
Мне тоже глаза режет немного. Но если чуть задуматься над корнями слов, то всё ясно. Объявить - просто объявление, оно же сообщение, что такое где-то есть. А определить - уже конкретно определиться, что это мы будем использовать.
В крайнем случае можно загуглить или подсмотреть в литературе. А вашу личную выдумку где смотреть каждый раз новому человеку?
[uquote="ARV",url="/forum/viewtopic.php?p=3705979#p3705979"]ну как бы реализация всегда является и описанием в Си, т.е. если в заголовок включить реализацию функции, например, а потом этот заголовок включить в несколько разных исходников, линкеру это не понравится. то же самое с переменными.
и никакие #ifdef не помогут[/uquote]
Человек выше про "объекник" говорил - .o файл, а не хидер.Правильно "объектники" называются юниты. Вот он очередной пример бед от своей терминологии.
EDIT: Точнее конечно .o файлик - это отдельная вещь, но в данном случая важна не она. Это вообще метод работы конкретного компилятора и к стандартам языка он не относится. В стандартах языка есть понятие "translation unit" - это один отдельный .c файл, со всеми его инклюдами препроцессора.
Мне тоже глаза режет немного. Но если чуть задуматься над корнями слов, то всё ясно. Объявить - просто объявление, оно же сообщение, что такое где-то есть. А определить - уже конкретно определиться, что это мы будем использовать.
В крайнем случае можно загуглить или подсмотреть в литературе. А вашу личную выдумку где смотреть каждый раз новому человеку?
[uquote="ARV",url="/forum/viewtopic.php?p=3705979#p3705979"]ну как бы реализация всегда является и описанием в Си, т.е. если в заголовок включить реализацию функции, например, а потом этот заголовок включить в несколько разных исходников, линкеру это не понравится. то же самое с переменными.
и никакие #ifdef не помогут[/uquote]
Человек выше про "объекник" говорил - .o файл, а не хидер.Правильно "объектники" называются юниты. Вот он очередной пример бед от своей терминологии.
EDIT: Точнее конечно .o файлик - это отдельная вещь, но в данном случая важна не она. Это вообще метод работы конкретного компилятора и к стандартам языка он не относится. В стандартах языка есть понятие "translation unit" - это один отдельный .c файл, со всеми его инклюдами препроцессора.
Последний раз редактировалось NStorm Пн сен 23, 2019 15:44:10, всего редактировалось 1 раз.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3705966#p3705966"]Что такое "сильная связь", не знаю такого термина в программировании?[/uquote]а термина для этого нет. "Такое" это как раз использование всех своих объектов в любом наугад выбранном месте вместо организации четкой иерархии отдельных самостоятельных блоков и "клея" между ними.
Добавлено after 1 minute 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3705979#p3705979"]а вот я считаю, что определились не правильно[/uquote]тем не менее, такая вот общепринятая терминология - сложившийся факт. Использовать ее лучше, чем каждому выдумывать свою собственную.
Добавлено after 1 minute 54 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3705979#p3705979"]а вот я считаю, что определились не правильно[/uquote]тем не менее, такая вот общепринятая терминология - сложившийся факт. Использовать ее лучше, чем каждому выдумывать свою собственную.
ARV, Вы inline функции в заголовочных файлах не реализуете? А X-Macro принципиально не пользуетесь?
А по поводу переменных, посмотрите пример моего кода все же. А после этого объясните, что же там может компоновщику не понравиться?
Добавлено after 4 minutes 51 second:
[uquote="NStorm",url="/forum/viewtopic.php?p=3705986#p3705986"]Правильно "объектники" называются юниты.[/uquote]
Почитайте хоть, что такое объектный файл
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))
А по поводу переменных, посмотрите пример моего кода все же. А после этого объясните, что же там может компоновщику не понравиться?
Добавлено after 4 minutes 51 second:
[uquote="NStorm",url="/forum/viewtopic.php?p=3705986#p3705986"]Правильно "объектники" называются юниты.[/uquote]
Почитайте хоть, что такое объектный файл
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3705990#p3705990"]Почитайте хоть, что такое объектный файл
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))[/uquote]
Я поправил пост. Я в курсе, что такое объектный файл. И что такое "единица трансляции". У вас же важно не в каком бинарном объектном файле окажется, а где оно будет на этапе "единицы трансляции" еще написано.
Обычно всем и транскрипция с unit понятна.
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))[/uquote]
Я поправил пост. Я в курсе, что такое объектный файл. И что такое "единица трансляции". У вас же важно не в каком бинарном объектном файле окажется, а где оно будет на этапе "единицы трансляции" еще написано.
Обычно всем и транскрипция с unit понятна.
NStorm, у меня на этапе трансляции компилятор выделит память в объектном файле, сформированном из того исходного файла, в котором объявлен _MAIN_C_. С точки зрения программиста, действительно ли это исходный файл с функцией main() или какой-то иной - значения не имеет. После работы компоновщика это все равно станет неразличимым.
Сам я пишу #define _MAIN_C_ действительно в головном исходном файле. Просто чтобы не забыть объявить _MAIN_C_ в одном из файлов проекта.
Сам я пишу #define _MAIN_C_ действительно в головном исходном файле. Просто чтобы не забыть объявить _MAIN_C_ в одном из файлов проекта.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
ПростоНуб, это да, я с этим и не спорил. ) Это для ARV писал, что речь об "объекнике" была, а не header'е. Потом перечитал свой пост, понял что возможно не очень ясно выразился и дополнил его.
Кстати (это уже о другом), ведь в чисто C (без плюсов) есть tentative definition и ваша конструкция для extern необязательна из примера в общем-то. Но имеет смысл.
Кстати (это уже о другом), ведь в чисто C (без плюсов) есть tentative definition и ваша конструкция для extern необязательна из примера в общем-то. Но имеет смысл.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3705989#p3705989"]а термина для этого нет. "Такое" это как раз использование всех своих объектов в любом наугад выбранном месте вместо организации четкой иерархии отдельных самостоятельных блоков и "клея" между ними.[/uquote]То есть, это чисто ваше IMHO? Ну тогда вопрос переходит в плоскость "чьё кунг-фу сильнее". Язык программирования и мой опыт позволяет писать абсолютно не конфликтующий между собой код. Это мой осознанный выбор. И пока не будет ссылки на более менее авторитетное исследование говорящее о вреде такого подхода, все это бла-бла-бла.
Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.
Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.
NStorm, если честно, не понял Вашу мысль. Если не формировать extern при включении этого заголовочного файла в остальные исходные тексты проекта, то компилятор выделит память под эту переменную в каждом объектном файле. И компоновщик отругается на дублирование имени внешней ссылки. А если в остальных файлах декларировать эту переменную, как extern (tentative definition), то сразу теряется смысл идеи - описывать переменную одной строкой один раз в одном месте. То бишь, то что я использую - просто мелкое удобство для ленивого программиста. Если вдруг эта переменная должна будет стать не uint8_t, а uint16_t, то править я это буду в одном месте и один раз )
Добавлено after 10 minutes 55 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3706045#p3706045"]Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.[/uquote]
Не понимаю, как сочетать компиляцию всех исходников при сборке и серьёзный проект. Они что ли переходят от ежедневных ночных сборок к еженедельным? Если серьёзный проект надо пересобрать полностью, то это всяко на выходные процесс, ну никак не на ночь, даже с distcc. Не поделитесь ссылкой на то, что Вы имеете ввиду? Какого рода оптимизации от компилятора пытаются добиться таким путём?
Добавлено after 10 minutes 55 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3706045#p3706045"]Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.[/uquote]
Не понимаю, как сочетать компиляцию всех исходников при сборке и серьёзный проект. Они что ли переходят от ежедневных ночных сборок к еженедельным? Если серьёзный проект надо пересобрать полностью, то это всяко на выходные процесс, ну никак не на ночь, даже с distcc. Не поделитесь ссылкой на то, что Вы имеете ввиду? Какого рода оптимизации от компилятора пытаются добиться таким путём?
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706049#p3706049"]Не поделитесь ссылкой на то, что Вы имеете ввиду? Какого рода оптимизации от компилятора пытаются добиться таким путём?[/uquote]
Один из примеров - это sqlite:
Один из примеров - это sqlite:
Код: Выделить всё
All of the individual C source code and header files (both manually-edited and automatically-generated) can be combined into a single big source file sqlite3.c called "the amalgamation". The amalgamation is the recommended way of using SQLite in a larger application. Combining all individual source code files into a single big source code file allows the C compiler to perform more cross-procedure analysis and generate better code. SQLite runs about 5% faster when compiled from the amalgamation versus when compiled from individual source files.как-то нужды не возникало. и я вел речь о том, чтобы не задваивалось из-за размещения в заголовке, а то, что по определению должно задваиваться, я, естественно, не рассматриваю.ПростоНуб писал(а):Вы inline функции в заголовочных файлах не реализуете?
видите ли в чем дело: мою терминологию поймет даже непрограммист, если он владеет русским языком, и при этом ему не потребуется рыться в гугле или вики. терминология же, требующая даже от специаста уточнений - плохая терминология.NStorm писал(а):А вашу личную выдумку где смотреть каждый раз новому человеку?
когда я говорил "хидер", меня поправляли "хЭдер". поэтому я использую свой "термин" - заголовочный файл или заголовок. насколько я помню, заголовочный файл - это тоже устоявшийся терминNStorm писал(а):а не хидер
я об этом прочел вот только что, и понятия не имею, что это. а первая ссылка гугла выдала такое описание, что я лучше и дальше буду не знать, чем стану вникать в этот мрак...ПростоНуб писал(а):А X-Macro принципиально не пользуетесь?
вот именно об этом я и говорил - самого первого переводчика стандарта Си никто не поправил, а сам он не стал лишний раз перечитывать, и вот... имеем то, что имеемNStorm писал(а):Потом перечитал свой пост, понял что возможно не очень ясно выразился и дополнил его.
дык вроде как LTO придумана именно для того, чтобы от этого отказаться... или я не прав?VladislavS писал(а):существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация
я тоже вашу, если честноПростоНуб писал(а): если честно, не понял Вашу мысль
Добавлено after 3 minutes 30 seconds:
кстати, господа-профессионалы, открою вам страшную тайну: самое полезное, что я почерпнул из форумов (к сожалению, не этого), это использование !! для получения гарантированного булева значения выражения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


