-
- а мне стало интересно, что static делает для функции, кроме прятания ее имени от линкера (ну то есть изъятием из public-а)? мурашки бывают вроде со static inline, но это уже с++ по-моему... - ыыыы(13.08.2013 17:30)
- Вроде какие-то из компиляторов/линкеров линкуют static-функции даже, если они нигде ни разу не вызываются/не используются. - rezident(14.08.2013 00:39 - 00:55)
- в последнее время многие Си-компилеры потребляют только static inline - просто inline не хотят, кроме того любят всякие прагмы типа inline force. Их и понять иногда можно - ведь если вдруг в inline функции есть вызов какой другой функции, компилер Vit(105 знак., 13.08.2013 19:55)
- Если inline не static, то может вызываться из другого модуля и у ней должен быть адрес. И будет call по адресу вместо вinlineивания. Кроме того, если текста функции нет в *.h, то вообще непонятно что там вinlineивать и опять же будет call. - fk0(14.08.2013 13:32)
- Это как? - Bill(13.08.2013 21:42)
- если inline foo1() вызывает некую foo2(), то компилятору неведомо, не вызовет ли в конечном счете foo2(), допустим, через вызов foo3(), функцию foo1(). тем самым заинлайнить вроде как и не получается - Vit(14.08.2013 00:05)
- Я немного не о том. Что значит "просто inline компиляторы не хотят". Они что, ошибку какую выдают, или что? - Bill(14.08.2013 14:07)
- да, ошибки выдают - Vit(14.08.2013 14:09)
- А ошибки какие? И компиляторы? - Bill(14.08.2013 14:47)
- Например, в самом свежем ЯРе для MSP430 линкер в несознанку уходит с Error[e46]: Undefined external "Foo" referred in ... - Vit(14.08.2013 15:10, ссылка)
- Ну тогда другой вопрос: как эти самые inline функции вы объявляете? - Bill(14.08.2013 15:32)
- пишу в хедере. если вкатать в Си-шник с inline, но без static, а прототип в хедер без inline, то собирается, но нахрена оно такое нужно, а если прототип с inline, то всё та же e46 - Vit(14.08.2013 15:34 - 15:38)
- Все понятно. Только нужно просто в заголовочном файле определить функцию как inline, а в Си файле вообще ничего не нужно определять. Ведь самой функции, как таковой, нет. Компилятор вместо вызова функции генерирует последовательность операторов, Bill(74 знак., 14.08.2013 15:51, ссылка)
- Повторяю - если в хедере объявить inline без static (как в Вашем примере), то e46. Может, ошибки и не будет, если хедер включать только в один модуль, но мне такое чудо не надо - Vit(14.08.2013 15:58, ссылка)
- а в хедере static inline? ничему ж не противоречит? - abivan(14.08.2013 16:07)
- да мне пофигу их мурашки. если нужна inline функция в куче модулей и с записью static inline в хедере этим компилятором/линкером оно собирается, то и ладно. а где-то и без static собиралось. а где-то __inline, а где-то INLINE. если бы не некоторые Vit(53 знак., 14.08.2013 16:13)
- без макроса не обойтись :-) abivan(131 знак., 14.08.2013 16:42)
- :) - Vit(14.08.2013 16:44)
- без макроса не обойтись :-) abivan(131 знак., 14.08.2013 16:42)
- да мне пофигу их мурашки. если нужна inline функция в куче модулей и с записью static inline в хедере этим компилятором/линкером оно собирается, то и ладно. а где-то и без static собиралось. а где-то __inline, а где-то INLINE. если бы не некоторые Vit(53 знак., 14.08.2013 16:13)
- У меня все прекрасно собирается без всяких ошибок. А заголовочный файл является общим для всего проекта. Поэтому он включается во все модули проекта. - Bill(14.08.2013 16:05)
- ЗЫ. Проверьте, плз, есть ли у Вас вызовы одной inline-функции в разных модулях, а то на пустышки линкер не ругается - Vit(14.08.2013 16:19)
- Конечно есть. Только линкер здесь ни причем. До него дело лаже не доходит. Это же inline функции! Bill(212 знак., 14.08.2013 19:19)
- у ЯРя линкеру не нравится C99 - какие у них отношения?:) - Vit(14.08.2013 20:55)
- Я же пример сгенерированного кода привел. Или из него ничего не ясно? - Bill(14.08.2013 22:11)
- Ясно только, что по
одному вызову двух функцийодной подстановке сгенерировалось. Двухвызовов одной функцииодинаковых подстановок не видел. И то, что ошибку описывает IAR, Вас не волнует - Vit(14.08.2013 22:39)- Вы хотите, чтобы я все листинги проекта выложил? - Bill(15.08.2013 06:30)
- Если у Вас IAR под 430, то интересно включено ли C99 и какой уровень оптимизации. Больше ничего не нужно. - Vit(15.08.2013 07:42)
- Увы, у меня AVR V5.51 - Bill(15.08.2013 08:57)
- Если у Вас IAR под 430, то интересно включено ли C99 и какой уровень оптимизации. Больше ничего не нужно. - Vit(15.08.2013 07:42)
- Вы хотите, чтобы я все листинги проекта выложил? - Bill(15.08.2013 06:30)
- Ясно только, что по
- Я же пример сгенерированного кода привел. Или из него ничего не ясно? - Bill(14.08.2013 22:11)
- у ЯРя линкеру не нравится C99 - какие у них отношения?:) - Vit(14.08.2013 20:55)
- Конечно есть. Только линкер здесь ни причем. До него дело лаже не доходит. Это же inline функции! Bill(212 знак., 14.08.2013 19:19)
- Я за Вас рад:) Когда смените компилятор и увидите какую-нить хрень типа е46, вспомните меня:) - Vit(14.08.2013 16:08)
- Я тогда вам обязательно сообщу. ;) - Bill(14.08.2013 16:09)
- ЗЫ. Проверьте, плз, есть ли у Вас вызовы одной inline-функции в разных модулях, а то на пустышки линкер не ругается - Vit(14.08.2013 16:19)
- а в хедере static inline? ничему ж не противоречит? - abivan(14.08.2013 16:07)
- Повторяю - если в хедере объявить inline без static (как в Вашем примере), то e46. Может, ошибки и не будет, если хедер включать только в один модуль, но мне такое чудо не надо - Vit(14.08.2013 15:58, ссылка)
- Все понятно. Только нужно просто в заголовочном файле определить функцию как inline, а в Си файле вообще ничего не нужно определять. Ведь самой функции, как таковой, нет. Компилятор вместо вызова функции генерирует последовательность операторов, Bill(74 знак., 14.08.2013 15:51, ссылка)
- пишу в хедере. если вкатать в Си-шник с inline, но без static, а прототип в хедер без inline, то собирается, но нахрена оно такое нужно, а если прототип с inline, то всё та же e46 - Vit(14.08.2013 15:34 - 15:38)
- Ну тогда другой вопрос: как эти самые inline функции вы объявляете? - Bill(14.08.2013 15:32)
- Например, в самом свежем ЯРе для MSP430 линкер в несознанку уходит с Error[e46]: Undefined external "Foo" referred in ... - Vit(14.08.2013 15:10, ссылка)
- А ошибки какие? И компиляторы? - Bill(14.08.2013 14:47)
- да, ошибки выдают - Vit(14.08.2013 14:09)
- Хвостовая рекурсия прекрасно оптимизируется в страшный goto. - fk0(14.08.2013 13:30)
- Я немного не о том. Что значит "просто inline компиляторы не хотят". Они что, ошибку какую выдают, или что? - Bill(14.08.2013 14:07)
- если inline foo1() вызывает некую foo2(), то компилятору неведомо, не вызовет ли в конечном счете foo2(), допустим, через вызов foo3(), функцию foo1(). тем самым заинлайнить вроде как и не получается - Vit(14.08.2013 00:05)
- а чем рекурсивный вызов плох? по-моему в цикл его мало какой(?) С-компилер разворачивает. да, стек может рекурсия убить, но это не компилера забота. по-хорошему (если программист думает мозгОм) inline она уже и есть статик, то есть она действует ыыыы(428 знак., 13.08.2013 20:48)
- рекурсивный вызов это уже не inline - запись а-ля макрос, а вызов с прологами/эпилогами - Vit(14.08.2013 00:08, ссылка)
- а мне стало интересно, что static делает для функции, кроме прятания ее имени от линкера (ну то есть изъятием из public-а)? мурашки бывают вроде со static inline, но это уже с++ по-моему... - ыыыы(13.08.2013 17:30)