Вопросы по С/С++ (СИ)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3705352#p3705352"][uquote="VladislavS",url="/forum/viewtopic.php?p=3705335#p3705335"]мало ли где что я использовать буду.[/uquote]вот это и есть, собственно, фиговая практика.[/uquote]Обоснование будет? Или просто бла-бла?
- Реклама
Re: Вопросы по С/С++ (СИ)
[uquote="FeCat",url="/forum/viewtopic.php?p=3705652#p3705652"]Где идеологически правильнее объявлять и определять объекты которые используются во многих местах?[/uquote]
Объявлять - в хидерах очевидно.
Объявлять - в хидерах очевидно.
Re: Вопросы по С/С++ (СИ)
[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]обоснование того, почему сильная связь разнонаправленных участков кода и хаотичное "мали ли где чего" вместо их разделения и изолирования - так себе подход? нет, не будет.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
имхо, в великом и могучем термины "определять" и "объявлять" вполне могут быть взаимозаменяемыми... что кардинально искажает смысл в контексте программирования.arkhnchul писал(а):определять в своих заголовочниках вестимо. Объявлять - уже поразнообразнее.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:
описание
Код: Выделить всё
extern uin8_t var;
void foo(void);Код: Выделить всё
uint8_t var;
void foo(void){
printf("foo\n");
}Код: Выделить всё
var = 12;
foo();если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, если Вы видели пример моего заголовочного файла выше, то могли заметить, что описание и реализация у меня всегда совмещены в одной конструкции. А уж в какой объектник попадет "реализация", точнее в каком объектнике будет выделена память и сформирована внешнаяя ссылка для компоновщика на эту память - совершенно не принципиально.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
возможно, для С++ это нормально, но для Си - не совсем.ПростоНуб писал(а):описание и реализация у меня всегда совмещены в одной конструкции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[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 запретили? Зато всё в одном месте - труднее ошибиться.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, пример то был как раз на C
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=3705951#p3705951"]имхо, в великом и могучем термины "определять" и "объявлять" вполне могут быть взаимозаменяемыми... что кардинально искажает смысл в контексте программирования.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:[/uquote]
Во всей литературе уже давно определились как переводить declaration и definition - объявлять и определять. Не надо пожалуйста придумывать свою терминологию. Еще больше искажает смысл именно подобное.
лично я для себя и в беседах с другими предпочитаю использовать чуть иную терминологию, уже не допускающую разных толкований:[/uquote]
Во всей литературе уже давно определились как переводить declaration и definition - объявлять и определять. Не надо пожалуйста придумывать свою терминологию. Еще больше искажает смысл именно подобное.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
а вот я считаю, что определились не правильно. возможно, какой-то самый первый переводчик в русском языке не разбирался, как следует, и выбрал "буквальный" перевод, ну а остальные просто копипастили... а для русского важен не буквальный, а смысловой перевод. вот сколько лет читаю - столько и не могу привыкнуть. вам проще, если смогли. видимо, тоже не особо загружены знаниями в русском языке...NStorm писал(а):уже давно определились как переводить declaration и definition
ну как бы реализация всегда является и описанием в Си, т.е. если в заголовок включить реализацию функции, например, а потом этот заголовок включить в несколько разных исходников, линкеру это не понравится. то же самое с переменными.VladislavS писал(а):Какая разница то?
и никакие #ifdef не помогут
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[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 раз.
Re: Вопросы по С/С++ (СИ)
[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]тем не менее, такая вот общепринятая терминология - сложившийся факт. Использовать ее лучше, чем каждому выдумывать свою собственную.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
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]
Почитайте хоть, что такое объектный файл
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))
Re: Вопросы по С/С++ (СИ)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3705990#p3705990"]Почитайте хоть, что такое объектный файл
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))[/uquote]
Я поправил пост. Я в курсе, что такое объектный файл. И что такое "единица трансляции". У вас же важно не в каком бинарном объектном файле окажется, а где оно будет на этапе "единицы трансляции" еще написано.
Обычно всем и транскрипция с unit понятна.
И не надо засорять русский язык английскими словами в русской транскрипции. Это уж точно "правильным" не назовешь )))[/uquote]
Я поправил пост. Я в курсе, что такое объектный файл. И что такое "единица трансляции". У вас же важно не в каком бинарном объектном файле окажется, а где оно будет на этапе "единицы трансляции" еще написано.
Обычно всем и транскрипция с unit понятна.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
NStorm, у меня на этапе трансляции компилятор выделит память в объектном файле, сформированном из того исходного файла, в котором объявлен _MAIN_C_. С точки зрения программиста, действительно ли это исходный файл с функцией main() или какой-то иной - значения не имеет. После работы компоновщика это все равно станет неразличимым.
Сам я пишу #define _MAIN_C_ действительно в головном исходном файле. Просто чтобы не забыть объявить _MAIN_C_ в одном из файлов проекта.
Сам я пишу #define _MAIN_C_ действительно в головном исходном файле. Просто чтобы не забыть объявить _MAIN_C_ в одном из файлов проекта.
Re: Вопросы по С/С++ (СИ)
ПростоНуб, это да, я с этим и не спорил. ) Это для ARV писал, что речь об "объекнике" была, а не header'е. Потом перечитал свой пост, понял что возможно не очень ясно выразился и дополнил его.
Кстати (это уже о другом), ведь в чисто C (без плюсов) есть tentative definition и ваша конструкция для extern необязательна из примера в общем-то. Но имеет смысл.
Кстати (это уже о другом), ведь в чисто C (без плюсов) есть tentative definition и ваша конструкция для extern необязательна из примера в общем-то. Но имеет смысл.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3705989#p3705989"]а термина для этого нет. "Такое" это как раз использование всех своих объектов в любом наугад выбранном месте вместо организации четкой иерархии отдельных самостоятельных блоков и "клея" между ними.[/uquote]То есть, это чисто ваше IMHO? Ну тогда вопрос переходит в плоскость "чьё кунг-фу сильнее". Язык программирования и мой опыт позволяет писать абсолютно не конфликтующий между собой код. Это мой осознанный выбор. И пока не будет ссылки на более менее авторитетное исследование говорящее о вреде такого подхода, все это бла-бла-бла.
Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.
Более того, существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация. Этим пользуются достаточно серьёзные проекты, поищите.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
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. Не поделитесь ссылкой на то, что Вы имеете ввиду? Какого рода оптимизации от компилятора пытаются добиться таким путём?
Re: Вопросы по С/С++ (СИ)
[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.- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
как-то нужды не возникало. и я вел речь о том, чтобы не задваивалось из-за размещения в заголовке, а то, что по определению должно задваиваться, я, естественно, не рассматриваю.ПростоНуб писал(а):Вы inline функции в заголовочных файлах не реализуете?
видите ли в чем дело: мою терминологию поймет даже непрограммист, если он владеет русским языком, и при этом ему не потребуется рыться в гугле или вики. терминология же, требующая даже от специаста уточнений - плохая терминология.NStorm писал(а):А вашу личную выдумку где смотреть каждый раз новому человеку?
когда я говорил "хидер", меня поправляли "хЭдер". поэтому я использую свой "термин" - заголовочный файл или заголовок. насколько я помню, заголовочный файл - это тоже устоявшийся терминNStorm писал(а):а не хидер
я об этом прочел вот только что, и понятия не имею, что это. а первая ссылка гугла выдала такое описание, что я лучше и дальше буду не знать, чем стану вникать в этот мрак...ПростоНуб писал(а):А X-Macro принципиально не пользуетесь?
вот именно об этом я и говорил - самого первого переводчика стандарта Си никто не поправил, а сам он не стал лишний раз перечитывать, и вот... имеем то, что имеемNStorm писал(а):Потом перечитал свой пост, понял что возможно не очень ясно выразился и дополнил его.
дык вроде как LTO придумана именно для того, чтобы от этого отказаться... или я не прав?VladislavS писал(а):существует приём сборки проекта, когда все исходники собирают в одну большею кучу, которую скармливают компилятору. Так достигается максимальная оптимизация
я тоже вашу, если честноПростоНуб писал(а): если честно, не понял Вашу мысль
Добавлено after 3 minutes 30 seconds:
кстати, господа-профессионалы, открою вам страшную тайну: самое полезное, что я почерпнул из форумов (к сожалению, не этого), это использование !! для получения гарантированного булева значения выражения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


