Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

Объявляю функцию как inline void в прототипе пишу extern inline void
в одном проекте все работает перенес библиотеку в другой проект
компилятор IAR выдает ошибку.

Код: Выделить всё

Error[Li005]: no definition for "Login_enter" 
убираю модификатор inline все находит (делаю вывод что файл header подключается нормально)

Даже не знаю в какую сторону копать.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

честно говоря, я не уверен в том, что сейчас скажу, но предполагаю, что inline - это квалификатор для компилятора, который строит код модуля путем встраивания (т.е. повтора) в нужных местах кода функции, а extern - это квалификатор для линкера, который просто расставляет ссылки на единожды имеющийся где-то код. то есть это взаимоисключающие квалификаторы - нельзя быть одновременно повторяемым куском кода и единственным куском.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Вопросы по С/С++ (СИ)

Сообщение pokk »

Странно то что в одном месте компилятор это переживал, а в другом не захотел.
Но да ладно, тогда как по феншую выдать переменную из одного модуля в другой, желательно что бы было без входа в функцию?

Глобальными переменными что-то надоело пользоваться, решил по пробовать выдать и изменить через функцию.
Но даже при максимально оптимизации по скорости он все равно производит вход в функцию,где происходит только присваивание 1 или 0 переменной и все.

Ps: прогнал на самой высокой оптимизации не в одном варианте функцию не вывернул.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

И что Вас в этом смущает ? С чего такая уверенность, что компилятор обязан эти функции проинлайнить ? Не посчитал нужным - не заинлайнил, посчитает - заинлайнит.

Как вариант - extern, а вместо функций - макросы в хидере.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Вопросы по С/С++ (СИ)

Сообщение ptr128 »

ARV писал(а):inline - это квалификатор для компилятора, который строит код модуля путем встраивания (т.е. повтора) в нужных местах кода функции, а extern - это квалификатор для линкера, который просто расставляет ссылки на единожды имеющийся где-то код. то есть это взаимоисключающие квалификаторы - нельзя быть одновременно повторяемым куском кода и единственным куском.
Близко к истине, но не так. В оригинале значится: "By declaring a function inline, you can direct GCC to make calls to that function faster."
На всякий случай перевод: "Объявляя функцию inline, вы указываете GCC сделать вызовы этой функции быстрее".
В некоторых случаях, данная функция действительно может оказаться в коде, а не в виде отдельной подпрограммы. Например, если она вызывается с одинаковым набором параметров или всего один раз.
extern - это указание компилятору, что данный идентификатор внешний, доступный для обработки LD. Так как любая не статическая функция, с кодом в текущем файле, является внешней то, запись
int func(int i) { return i++;}
и запись
extern int func(int i) { return i++;}
имеют один и тот же смысл, так как если функция не статическая, то значит она внешняя.

А вот сочетание этих extern и inline в одном месте может действительно привести к неожиданным последствиям.
Подробности: https://gcc.gnu.org/onlinedocs/gcc/Inline.html
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

pokk писал(а):Даже не знаю в какую сторону копать.
В сторону понимания сущности inline. И немного в сторону понимания того, как работает трио препроцессор-компилятор-линкер. Первый лепит из *.h и *.c большие простынки *.(ну скажем pp) и скармливает их компилятору. На выходе компилятора появляется *.o - файл со скомпилированными объектами. Линкер собирает согласно списка все объектные файлы в программу - устанавливает связи (linker- ведь!) между объектами, попутно проверяя все ли ссылки из модулей находят объекты в других модулях и однозначны ли эти связи. Если компилятор изыскивает возможность реально заинлайнить функцию - то как объект в модуле она существовать не будет - и попытка заставить линкер связать вызов из других модулей на такую функцию закономерно обломится.
Таким образом реконструкция катастрофы выглядит следующим образом - предыдуший компилятор толи не решился функцию инлайнить, то ли решил, что раз она объявлена в заголовке [???] то программист по ходу "не сечёть фишку" и добро-бы перестраховаться - создал её "в теле". IAR же или по упёртости или по жестоковыйности своей натуры возжелав наказать "неряху" - заинлайнил функцию, спихнув на линкера ответственность разгребаться в связях [подобно пьяному дьячку на колокольне].
Что делать - учиться програменному делу настояшим образом ©, знать и любить свой инструмент как солдат лопату. :) static, inline - это не ускоряющие заклинания, а конкретные требования к компилятору - который в общем-то тупой исполнитель нашей воли. Т.е. если inline функция, грубо говоря, слегка подобна макросу - и пользоваться сей "макрос" будет в нескольких единицах компиляции (т.е. препроцессорных простынях собранных из С-файлов) то помещать его хорошо туда где его все увидят - т.е. в файл заголовка. НО! Как уже замечалось выше - компилятор порою избирательно туп и если он откажется инлайнить функцию, определённую в заголовке, - то у линкера появятся претензии иного рода - к наличию множественных копий её тела в разных объектных файлах. Т.е. мы плавненько возвращаемся к первому предложению этого абзаца - понимание того как работают инструменты позволит расшивать ситуации на лету вне зависимости от причуд конкретного компилятора.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

добавлю еще об inline: эта директива не принуждает компилятор обязательно инлайнить тело функции, это лишь рекомендация сделать это, если подвернется возможность (или необходимость). а вот какие там возможности или необходимости будут - это отдано на откуп компилятору, ему и решать. для гарантированного инлайна применяются всякие костыли (вероятно, разные для разных компиляторов). например, AVR-GCC должен всегда инлайнить функцию, для которой задан атрибут always_inline.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

Кто какую использует форму записи макроса, дабы в проге было видно четкое различие между оным, переменной и функцией ?
Tell Me The Truth
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Ну.. строгих правил на этот счёт нет, но я предпочитаю что-то вроде

Код: Выделить всё

MACROS_NAME
functionName
ClassName
varName
переменная и функция вроде как и одинаково выглядят, но функция хорошо по скобкам видна.
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

Re: Вопросы по С/С++ (СИ)

Сообщение Мурато Мяуконни »

Вы, уважаемые, слишком-то не переусердствуйте с инлайнами то. А то результирующий код ваш будет разрастаться до нев...ных размеров. Не заставляйте компилятор решать за вас, где и как делать. Пишите сразу с умом.
Вы при написании сами прикидывайте, в каких функциях нужна скорость вызова, а где важнее краткость получаемого кода.
FreshMan писал(а):Кто какую использует форму записи макроса, дабы в проге было видно четкое различие между оным, переменной и функцией ?
Макрос, как вариация дефайна (переназначения, замены текста) - целиком заглавными буквами. Как бы это общепринятое правило, встречающееся во многих-многих исходниках.
К тому же, если у редактора есть возможность цветового выделения синтаксиса, то очень полезно разделять цвета. Я с удовольствием использую цветовые и начертательные (курсив, жирный, подчеркнутый) различия синтаксиса. Текст получается в высшей мере читаемым. Сразу видно различие глобальных и локальных переменных, выделяются комменты, параметры...
Главное, найти для себя наиболее удобную и читаемую схему и следовать ей во всех проектах.
Подпись убрал вместе с автором. aen
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Мурато Мяуконни писал(а):Вы, уважаемые, слишком-то не переусердствуйте с инлайнами то. А то результирующий код ваш будет разрастаться до нев...ных размеров
Уважаемый, кто эти "Вы" ? В упор не вижу, кто усердствует с инлайнами.
Или просто решили чем-то блеснуть, рассказав нам о явно очевидных вещах ? :facepalm:
Не заставляйте компилятор решать за вас, где и как делать.
Как же жить тогда, если нет доверия компилятору ? :dont_know:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Мурато Мяуконни писал(а):Главное, найти для себя наиболее удобную и читаемую схему и следовать ей во всех проектах
полностью подерживаю: единство стиля постоянно - залог успеха.
Мурато Мяуконни писал(а):Макрос, как вариация дефайна (переназначения, замены текста) - целиком заглавными буквами
лично я придерживаюсь иных правил:
1. определение пользовательского типа - всегда с _t на конце, всегда маленькими буквами: point_t
2. описание переменных - всегда маленькими буквами: counter, iteration;
3. функции - всегда маленькими буквами. сложные имена функций составляю из отдельных частей с помощью подчеркивания: some_func();
4. макрос-константа - всегда ЗАГЛАВНЫМИ: F_CPU
5. макрос-функция - всегда по правилу описания функции: some_macro();

по поводу 5-го пункта скажу, почему именно так: макрос-функция по своему определению выполняет более сложную задачу, нежели простая замена текста, это некий блок кода. и в любой момент может быть заменен на настоящую функцию - в этом случае придется изменить только макрос, а все его упоминания по тексту уже будут сделаны по правилам описания функций.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Кстати, по последнему моменту, когда макрос выглядит как функция.

По идее, можно макрос-функцию назвать MACRO_NAME(), и обернуть её в void macro_name() {MACRO_NAME()}.

Тогда и правило именования макросов заглавными буквами будет не нарушено, и в коде проблем быть не должно - компилятор при оптимизации эту вложенность должен убрать.
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

Re: Вопросы по С/С++ (СИ)

Сообщение Мурато Мяуконни »

Аlex писал(а):Как же жить тогда, если нет доверия компилятору ? :dont_know:
Очень просто. Либо вы - хозяин и руководитель, либо компилятор руководит вами, а вы лишь только пожимаете плечами и думаете, что компилятору видней.
А знаете ли вы, что даже компиляторы имеют очень развитую настройку, и что в зависимости от этих настроек поведение будет весьма разным. Не-не, это не только переключение уровней оптимизации.

Ну а про "сообщение очевидных вещей" - эт вы напрасно. Если у меня только 5 сообщений на форуме, это вовсе не означает, что я написал на Си только 5 строчек. Блеснуть я могу много чем, как бы вот...
И кстати, нечего мне тут "минусовать в карму", только за то, что вам че-то не понравилось. По уровню знаний и реализованных проектов я могу и вас переплюнуть, если че как бы вот.
Последний раз редактировалось Мурато Мяуконни Вс ноя 20, 2016 12:02:31, всего редактировалось 2 раза.
Подпись убрал вместе с автором. aen
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

WiseLord писал(а):По идее, можно макрос-функцию назвать MACRO_NAME(), и обернуть её в void macro_name() {MACRO_NAME()}.
разница только в том, что такая обертка потребует от вас править код во всех местах, где макрос вызывался, в то время как мой подход позволяет этого избежать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Мурато Мяуконни писал(а):Ну а про "сообщение очевидных вещей" - эт вы напрасно. Если у меня только 5 сообщений на форуме, это вовсе не означает, что я написал на Си только 5 строчек.
А что это значит ? Что написали 7 строк ? Я не экстрасенс и понятия не имею, сколько, чего и где Вы понаписали.
И причём тут очевидные вещи ? "Ему про Фому, а он про Ерёму" :facepalm:
Вы выскочили, обвинили нас в каком то переусердствовании, рассказав нам очевидность - инлайн функции раздувают код. К чему этот пост был ? Что в нём полезного ?
Мурато Мяуконни писал(а):По уровню знаний и реализованных проектов я могу и вас переплюнуть, если че как бы вот.
Улыбнуло :)
Смахивает на гонор малолетнего студента, запустившего свои первые часики на МК и бъющего себя в грудь - "Я великий эмбеддер" :)
Мурато Мяуконни писал(а):И кстати, нечего мне тут "минусовать в карму", только за то, что вам че-то не понравилось
Не стоит мне указывать, что мне делать. Я могу, ненароком, и сказать, куда вам пойти...
Лучше на вопрос ответьте, который я вам задал.
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

Re: Вопросы по С/С++ (СИ)

Сообщение Мурато Мяуконни »

ARV писал(а): 1. определение пользовательского типа - всегда с _t на конце, всегда маленькими буквами: point_t
С пользовательскими типами - это да, конечно. _t на конце. Хотя лично я не люблю часто переопределять типы. Единственное - это в структурах.

Добавлено after 3 minutes 42 seconds:
Аlex писал(а):Не стоит мне указывать, что мне делать. Я могу, ненароком, и сказать, куда вам пойти...
Лучше на вопрос ответьте, который я вам задал.
Так-так-так, полегче, полегче. Если вы модератор, то ведите себя подобающе, без хвастовства.
Какой вопрос вы задали? Озвучьте, и я вам обстоятельно отвечу. Если конечно сочту, что вы поймете ответ.
А то, я смотрю, вы всецело доверяете компилятору, и вероятно, не очень то в курсе того, как и что делает компилятор.
Подпись убрал вместе с автором. aen
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

ARV писал(а):
WiseLord писал(а):По идее, можно макрос-функцию назвать MACRO_NAME(), и обернуть её в void macro_name() {MACRO_NAME()}.
разница только в том, что такая обертка потребует от вас править код во всех местах, где макрос вызывался, в то время как мой подход позволяет этого избежать.
Вообще-то я говорил о том, чтобы макрос вызывался только из этой функции. А уже она - в коде.

P.S. Да, это мало отличается от того, чтобы просто назвать так макрос сразу. Но часто разные IDE не очень хорошо работают с автодополнением кода и прочими "плюшками" в случае использования макросов, особенно когда они окружены разного рода #ifdef/#else и т.п. Поэтому, возможно, "проброс" через функцию ещё и тут поленым оказаться может, тем более, что если у функции есть аргументы, то и подсказки по типам могут полезными оказаться.
Последний раз редактировалось WiseLord Вс ноя 20, 2016 12:39:34, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Мурато Мяуконни писал(а):Какой вопрос вы задали? Озвучьте, и я вам обстоятельно отвечу.
А вы почитайте повнимательнее. У меня всего один пост был, в нём трудно не заметить вопросительных знаков и вопросительную интонацию.
Мурато Мяуконни писал(а):Если конечно сочту, что вы поймете ответ.
Откуда же такая усведомлённость в моих знаниях ? И про то, что переплюнут меня, знаем. И про то, пойму ли я ответ, ...
Мурато Мяуконни писал(а):ведите себя подобающе
Опять указы :facepalm:
Да Вы, похоже, себя точно каким-то Богом чувствуете. И знаете больше всех, и указываете что кому делать... :facepalm:
Мурато Мяуконни писал(а):без хвастовства
Где вы хвастовство в моих постах увидели ?
На себя не пробовали посмотреть со стороны ? :)))


ЗЫ: Перестаньте набивать себе посты пустозвонным текстом. До хорошего это не доведёт, уверяю вас.
Мурато Мяуконни
Прорезались зубы
Сообщения: 203
Зарегистрирован: Сб ноя 19, 2016 21:05:48

Re: Вопросы по С/С++ (СИ)

Сообщение Мурато Мяуконни »

Пустозвонный текст пока что только у вас. К чему были вот эти ваши последние сообщения на этой странице??? Какую полезную инфу они несли? Прочтите их и подумайте.
А если хотите увидеть уровень моей квалификации - посмотрите список моих сообщений, первое мое сообщение на форуме - ответ на оставшийся без ответа вопрос по микроконтроллеру на ядре Cortex M7. У вас есть что сказать по этой теме? Хорошо, добро пожаловать в ту тему - с удовольствием обсудим с вами вопросы реализации обработки потокового видео с камеры разрешением не ниже VGA посредством STM32F746.
Подпись убрал вместе с автором. aen
Ответить

Вернуться в «Разные вопросы по МК»