реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> варнинг Keil c99
Метценгерштейн
сообщение Feb 4 2015, 07:48
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



#define __ASM __asm
и замена на маленькие буквы не помогла- надо искать где они определяются.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 07:52
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Замена обоих __ASM и __INLINE на маленькие буквы прямо в исходнике - просто обязаны помочь, так как __asm и __inline - это ключевые слова самого KEIL-а. В отличие от __ASM и __INLINE.

Переопределение через #define - может и не помочь, если потом, между Вашим определением и использованием, их еще кто-то переопределяет по-своему, но не так, как кейлу надо. Копайте вокруг этих двух ключевых слов.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Feb 4 2015, 08:39
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(toweroff @ Feb 3 2015, 22:43) *
а разве тело функции можно писать в хедере? wink.gif
Можно. Но если этот хидер будет включён несколько раз, то вы получите несколько таких функций. Линкер увидит такое и будет орать благим матом. Поэтому функции в хидерах должны обязательно объявляться как static.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 4 2015, 09:16
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(andrew_b @ Feb 4 2015, 11:39) *
Можно. Но если этот хидер будет включён несколько раз, то вы получите несколько таких функций. Линкер увидит такое и будет орать благим матом. Поэтому функции в хидерах должны обязательно объявляться как static.

да, такие грабли возможны.
А static как поможет? Я включаю файл хидера в .с файл. Обращаюсь к некой ф-ии в нем. И как тут компилятор узнает, что я обращаюсь к ф-ии именно данного включенного хидера?
Получается, что static говорит, что только к локальной ф-ии в этом файле я могу обратиться? Только внутри самого .с ?
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 4 2015, 14:32
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Static ограничивает область видимости функции текущей единицей компиляции, из других с-файлов она не будет видима.
Этот хидер - не хидер в обычном смысле, а кусок кода, вставляющийся в разные файлы. Поскольку функция объявлена как static, эти разные функции друг друга не видят, и друг другу не мешают.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 15:52
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(andrew_b @ Feb 4 2015, 11:39) *
Можно. Но если этот хидер будет включён несколько раз, то вы получите несколько таких функций. Линкер увидит такое и будет орать благим матом.


Ничего линкер не увидит. Это же __inline функция - она разворачивается еще компилятором. И, кроме как в хидерах, их нигде и не определить. Ну можно прямо в файле перед использованием.

PS
А вот смысл "static" применительно к __inline совершенно не понятен. Эта функция по любому видима только в пределах файла, где этот include вставлен.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 4 2015, 16:20
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Из стандарта:

A function declaration with an inline specifier declares an inline function. The inline
specifier indicates to the implementation that inline substitution of the function body at the point of call
is to be preferred to the usual function call mechanism. An implementation is not required to perform this
inline substitution at the point of call.....


inline - только рекомендация к встраиванию.


If a function with external linkage is
declared inline in one translation unit, it shall be declared inline in all translation units in which it appears;
no diagnostic is required. An inline function with external linkage shall have the same address in all
translation units.


Видимо, бывают еще извращения всякие.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 17:00
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Opex @ Feb 4 2015, 19:20) *

If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears;

Ну тем паче, такое можно сделать только, разместив ее в хидере. В общем, это факт, что инлайн-функции, которые могут быть использованы в нескольких файлах, всегда определяются в хидерах.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 4 2015, 17:18
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Попробовал для интереса, можно и в C-файле определить, работает.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 17:51
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Opex @ Feb 4 2015, 20:18) *
Попробовал для интереса, можно и в C-файле определить, работает.

Конечно, можно, так и делают, если она "местная", нигде больше не нужная. И, вообще, какая разница - если хидер включается еще на этапе препроцессора, и становится единым целым с файлом.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 4 2015, 17:55
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Цитата(SM @ Feb 4 2015, 22:51) *
Конечно, можно, так и делают, если она "местная", нигде больше не нужная. И, вообще, какая разница - если хидер включается еще на этапе препроцессора, и становится единым целым с файлом.


Я неточно выразился, в отдельном C-файле. А использовал ее в другом.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 17:57
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Opex @ Feb 4 2015, 20:55) *
Я неточно выразился, в отдельном C-файле. А использовал ее в другом.

А вот это лажа какая-то... Ее компилятор хоть и не обязан разворачивать, но должен, как все современные и порядочные компиляторы.... И возможности вызвать ее откуда-то снаружи при этом нет.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 4 2015, 18:12
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Еще интересный момент:

A static local variable in an extern inline function always refers to the same object.

Что несовместимо с определением функции в заголовочном файле. Быть может, где-то и находит применение...
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 4 2015, 20:20
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Opex @ Feb 4 2015, 21:12) *
Что несовместимо с определением функции в заголовочном файле.

Это с чего бы несовместимо? Учитывая то, что, собственно, отдельного кода эта функция не имеет, раз она инлайн, то от функции остается только статическая переменная, которая имеет вполне определенное уникальное имя (символ). Все совместимо.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 5 2015, 08:34
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Только вот эта статическая переменная будет разной для разных единиц компиляции. А так - одна на всех.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016