Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глупые вопросы по типам данных
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Spider
Тока не смейтесь smile.gif
А что означает static & violate (или как-то так) объявление переменных в WinAVR?
И что ещё бывает?
beer_warrior
Ой ужос!!!
И куда ж в эмбеддеры без этого? Фундамент блин.
volatile - говорит о том, что данные могут изменится в любой момент и следовательно данная переменная не подлежит оптимизации (например не выносится за пределы цикла, или ее многократный вызов не сокращается до однократного)ю Незаменимо в описании железа - всяческих портов и регистров статуса.

static сложнее.

Если применяется к локальной переменной в функции - значит ее значение сохраняется после выхода из функции. Очень хорош например для счетчиков событий в прерываниях.

Еслли применяется к переменной за пределами функции или к функции - значит область видимости ограничевается данным файлом.
Очень часто встречается связка static inline - для определения инлайновых функций прямо в хидер файле. Получается единственное определение функции при многократном включении файла в проект.
mdmitry
Можно использовать оба модификатора. Классы памяти описаны в любой книге по языку С и не являются специфическими для микроконтроллеров.
Oldring
Цитата(beer_warrior @ Apr 25 2007, 22:58) *
Очень часто встречается связка static inline - для определения инлайновых функций прямо в хидер файле. Получается единственное определение функции при многократном включении файла в проект.


static inline - это уже плюсы. inline подставляемый статический метод класса. Для глобальных функций использовать очень даже не нужно. Получится совсем наоборот: в каждм модуле будет сгенерирована своя независимая копия inline функции smile.gif
dxp
Цитата(Oldring @ Apr 26 2007, 04:10) *
static inline - это уже плюсы.

В GCC, к которому относится упомянутый выше WinAVR, имется расширение для С в виде inline, т.ч. это слово там валидно и в С режиме.

Цитата(Oldring @ Apr 26 2007, 04:10) *
inline подставляемый статический метод класса.

Насколько можно судить из:

Цитата
Очень часто встречается связка static inline - для определения инлайновых функций прямо в хидер файле. Получается единственное определение функции при многократном включении файла в проект.


речи тут ни о каких классах вообще нет. Статические функции-члены классов - это несколько из другой оперы.

Кстати, в С++ не бывает статических методов класса. Методы всегда нестатические.

Цитата(Oldring @ Apr 26 2007, 04:10) *
Для глобальных функций использовать очень даже не нужно. Получится совсем наоборот: в каждм модуле будет сгенерирована своя независимая копия inline функции smile.gif

Если функция объявлена как встраиваемая, то она в любом случае будет сгенерирована в каждой единице компиляции отдельно.
Shamil
Цитата(dxp @ Apr 26 2007, 10:20) *
Кстати, в С++ не бывает статических методов класса. Методы всегда нестатические.

А что в C++ появились методы класса ?
Или речь идет о каком либо расширении языка
как в C++ Builder ?
Oldring
Цитата(Shamil @ Apr 26 2007, 09:45) *
А что в C++ появились методы класса ?
Или речь идет о каком либо расширении языка
как в C++ Builder ?


Всегда были.
http://en.wikipedia.org/wiki/Method_(computer_science)
Shamil
Цитата(Oldring @ Apr 26 2007, 12:53) *

Если под методами подразумевались функции-члены класса,
то с чего бы это им не быть статическими ?
Статические функции (члены классы) используются довольно часто.
beer_warrior
Цитата
static inline - это уже плюсы. inline подставляемый статический метод класса.


Цитата
В GCC, к которому относится упомянутый выше WinAVR, имется расширение для С в виде inline, т.ч. это слово там валидно и в С режиме.


Если быть точным inline описан в стандарте С99, вмеcте с другими заимствованиями из плюсов.

C99 introduced several new features, many of which had already been implemented as extensions in several compilers:
-Inline functions
-Variables can be declared anywhere (as in C++), rather than only after another declaration or the start of a compound statement
-Several new data types, including long long int, optional extended integer types, an explicit boolean data type, and a complex type to represent complex numbers
-Variable-length arrays
-Support for one-line comments beginning with //, as in BCPL or C++
dxp
Цитата(beer_warrior @ Apr 26 2007, 14:19) *
Если быть точным inline описан в стандарте С99, вмеcте с другими заимствованиями из плюсов.

Я к том, что в GCC это расширение (как и некоторые другие) было до С99. Вроде так.
Oldring
Цитата(Shamil @ Apr 26 2007, 11:18) *
Если под методами подразумевались функции-члены класса,
то с чего бы это им не быть статическими ?
Статические функции (члены классы) используются довольно часто.


Ну так в плюсах традиционно слова "член" и "метод" полные синонимы. Если же претендовать на формальную точность, конечно, нужно говорить про методы объекта и методы класса. В этом смысле статические члены класса являются методами самого класса, а нестатические - методами объектов этого класса. Так как в плюсах вообще говоря нет динамически создаваемых классов, и классы синтаксически не эквивалентны объектам, такая интерпретация не может вызвать противоречия.

Цитата(beer_warrior @ Apr 26 2007, 11:19) *
Если быть точным inline описан в стандарте С99, вмеcте с другими заимствованиями из плюсов.


Признаюсь, я никогда не пользовал C99, считая, что если уж использовать нововведения по сравнению с первым ANSI C стандартом - то плюсы ничем не хуже. Не думаю, что в C99 интерпретация static inline префикса у функции будет чем-то отличаться от плюсов. То есть inline-подставляемая статическая функция. При определении функции в хедере вещь бесполезная и даже вредная. Ну а в модуле, конечно, можно использовать, учитывая особенности традиционных стилей кодирования в C.
dxp
Цитата(Shamil @ Apr 26 2007, 12:45) *
А что в C++ появились методы класса ?
Или речь идет о каком либо расширении языка
как в C++ Builder ?

Никаких расширений. Методы в С++ - это чисто терминология ООП, т.е. методы в нем - это функции-члены, которые могут быть переопределены в классах-потомках в контексте полиморфизма. Иными словами, в С++ методы - это виртуальные фукнции. Т.е. нестатические функции-члены классов делятся на обычные и виртуальные - вот эти виртуальные и являются методами. А все остальные - не методы.

Статические функции-члены классов - это вообще отдельная песня. Эти функции к самим объектам класса отношение имеют весьма опосредованное (для того, чтобы из статической функции-члена класса получить доступ к полям класса, надо явно указывать конкретный объект, к которому производится обращение). Фактически, это обычные глобальные фукнции, у которых область видимости ограничена классом, к которому они принадлежат, и которые имеют доступ к закрытым (и защищенным) членам своего класса. Виртуальными эти функции никак не могут быть, следовательно в С++ термин "статический метод" есть нонсенс.
Shamil
Цитата(dxp @ Apr 26 2007, 13:39) *
Никаких расширений. Методы в С++ - это чисто терминология ООП, т.е. методы в нем - это функции-члены, которые могут быть переопределены в классах-потомках в контексте полиморфизма. Иными словами, в С++ методы - это виртуальные фукнции. Т.е. нестатические функции-члены классов делятся на обычные и виртуальные - вот эти виртуальные и являются методами. А все остальные - не методы.

Теперь понятно, спасибо.
Oldring
Цитата(Shamil @ Apr 26 2007, 11:43) *
Теперь понятно, спасибо.


Не верьте этому разделению.
dxp
Цитата(Oldring @ Apr 26 2007, 14:37) *
Ну так в плюсах традиционно слова "член" и "метод" полные синонимы.

Это согласно какой же традиции С++? Огласите.

Цитата(Oldring @ Apr 26 2007, 14:37) *
Если же претендовать на формальную точность, конечно, нужно говорить про методы объекта и методы класса.

Фунции-члены класса != методы класса. См пост выше.

Цитата(Oldring @ Apr 26 2007, 14:37) *
В этом смысле статические члены класса являются методами самого класса, а нестатические - методами объектов этого класса.

Код
class A
{
public:
    ...
    static f();
};

A a;
...
a.f();  // вызвали статическую функцию-член класса путем обращения к объекту


Как же так, статическую функцию-член применили не к классу, а к объекту?! Она же, типа, следуя "формальной точности", принадлежит классу, а не к объекту.


Цитата(Oldring @ Apr 26 2007, 14:37) *
То есть inline-подставляемая статическая функция. При определении функции в хедере вещь бесполезная и даже вредная. Ну а в модуле, конечно, можно использовать, учитывая особенности традиционных стилей кодирования в C.

inline функция должна быть полностью определена перед ее использованием. Удобнее всего ее определение поместить в заголовочный файл, что и является общепринятой практикой в С++.

P.S. В С++ используется термин "единица компиляции", а не модуль. Модуль - это из других языков.


Цитата(Oldring @ Apr 26 2007, 14:50) *
Не верьте этому разделению.

Bjarne Stroustrup - The C++ Programming Language 3rd Edition:

Цитата
12.2.6 Virtual Functions [derived.virtual]
...
A virtual member function is sometimes called a method.

Теперь сами решите кому верить - Бьерну Страустурпу (автору языка С++) или отдельным самоуверенным товарисчам.
Oldring
Цитата(dxp @ Apr 26 2007, 12:23) *
Bjarne Stroustrup - The C++ Programming Language 3rd Edition:
Теперь сами решите кому верить - Бьерну Страустурпу (автору языка С++) или отдельным самоуверенным товарисчам.


Страуструп, конечно, величина - не спорю. Только как часто случается, его творение давно живет независимо от автора. А практикующий программист должен читать не только учебники. biggrin.gif

http://www.google.com/search?q=nonvirtual+method
dxp
Цитата(Oldring @ Apr 26 2007, 16:15) *
Страуструп, конечно, величина - не спорю. Только как часто случается, его творение давно живет независимо от автора.

В случае со Страуструпом это не так. Это его проект, был, есть и остается. И он возглавляет комитет по новшествам в языке, если склероз не врет.

Цитата(Oldring @ Apr 26 2007, 16:15) *
А практикующий программист должен читать не только учебники. biggrin.gif

http://www.google.com/search?q=nonvirtual+method

Речь идет не "о вообще", а конкретно о С++. И в С++ своя устоявшаяся терминология. Функции-члены классов там называются функциями-членами классов, при этом виртуальные функции иногда называют методами.

На самом деле все логично. Метод - это термин из ООП. Это функция в объектно-ориентированном дизайне, имеющаяя свойство быть переопределенной в потомке, что дает полиморфное поведение. В языках с динамической типизацией все функции такие в силу базовой модели языка. Но в С++ такими функциями являются только виртуальные, о чем Страуструп и говорит.

То, что все функции-члены в С++ часто называют методами - распространенное заблуждение. Часто этим грешат переводчики, что еще больше вносит путаницы в умы читателей.

P.S. Вижу, что на меня (вслед за Станиславом) тоже игнор поломался. biggrin.gif
Oldring
Цитата(dxp @ Apr 26 2007, 15:24) *
В случае со Страуструпом это не так. Это его проект, был, есть и остается. И он возглавляет комитет по новшествам в языке, если склероз не врет.
Речь идет не "о вообще", а конкретно о С++. И в С++ своя устоявшаяся терминология. Функции-члены классов там называются функциями-членами классов, при этом виртуальные функции иногда называют методами.

На самом деле все логично. Метод - это термин из ООП. Это функция в объектно-ориентированном дизайне, имеющаяя свойство быть переопределенной в потомке, что дает полиморфное поведение. В языках с динамической типизацией все функции такие в силу базовой модели языка. Но в С++ такими функциями являются только виртуальные, о чем Страуструп и говорит.

То, что все функции-члены в С++ часто называют методами - распространенное заблуждение. Часто этим грешат переводчики, что еще больше вносит путаницы в умы читателей.

P.S. Вижу, что на меня (вслед за Станиславом) тоже игнор поломался. biggrin.gif


В стандарте плюсов нет вообще упоминания понятия "метод". Точно также, как не известен стандарт "ООП". То есть "метод" - это неформальное понятие. Страуструп в книжке утверждает, что методами часто называют виртуальные функции. Он, безусловно, прав. Но простой поиск в гугле и мой личный опыт показывают, что также широко говорят "статические методы класса", "виртуальные методы класса" и т. д. И по-русски, и по-английски. Дело не в переводчиках. Хотите узнать "как реально говорят" - лучше не книжки читайте, а поройтесь в поисковиках.

Плюсы, конечно, не Смолток. Переопределять можно не все. Т. е. плюсы занимают промежуточную нишу между процедурными языками и чисто объектно-ориентированными, это компромисс, связанный с совместимостью и производительностью. И что с того, что некоторые методы объекта невозможно переопределить в потомке без специальных усилий? Это всего-лишь деталь реализации этого объекта. Вы в чисто процедурных языках вообще классы с функциями-членами встречали?

P.S. У меня игнор выборочный. Иногда читаю сообщения, при малейшем сомнении не отвечаю. В споры вступаю по минимуму, когда вижу шанс человека посадить. biggrin.gif Вроде вас со Станиславом и еще узким кругом мне обычно неприятных собеседников.
dxp
Цитата(Oldring @ Apr 26 2007, 18:51) *
В стандарте плюсов нет вообще упоминания понятия "метод".

Естественно, потому что термин "метод" к С++ никакого отношения не имеет.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Точно также, как не известен стандарт "ООП". То есть "метод" - это неформальное понятие. Страуструп в книжке утверждает, что методами часто называют виртуальные функции. Он, безусловно, прав.

Вот именно. Всякая терминология имеет смысл и пользу, если она вносит ясность, а не путаницу. У Страуструпа все четко и ясно - мухи от котлет отделены: обычные функции-члены от виртуальных (полиморфных), а у вас путаница, все в куче.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Но простой поиск в гугле и мой личный опыт показывают, что также широко говорят "статические методы класса", "виртуальные методы класса" и т. д. И по-русски, и по-английски. Дело не в переводчиках.

Простой поиск в гугле и ваш личный опыт лишь подтверждают широту заблуждений по этому вопросу. Не надо спорить с автором. Он автор, это его детище, он ввел терминологию, и будьте любезны в рамках ++ ее придерживаться. Во избежание путаницы. То же самое касается и всяких "модулей" (вместо "единиц компиляции").

Еще разок напомню, что "статические методы класса" в С++ - есть нонсенс.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Хотите узнать "как реально говорят" - лучше не книжки читайте, а поройтесь в поисковиках.

О! Вот это новость! Оказывается, книжки уже не авторитет. Очевидно, книжки классиков тоже. Ну-ну. Вместо четкого и ясного определения из первоисточников предлагается копаться в туче ссылок из поисковика, 90% которых в лучшем случае просто частные мнения каких-то неизвестных человеков. И относящихся по большей части не столько к С++, сколько к ООП вообще и другим языкам в частности (Java, C# и т.д.). Ценный совет, ничего не скажешь. Следование ему видно невооруженным взглядом.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Плюсы, конечно, не Смолток. Переопределять можно не все. Т. е. плюсы занимают промежуточную нишу между процедурными языками и чисто объектно-ориентированными, это компромисс, связанный с совместимостью и производительностью. И что с того, что некоторые методы объекта невозможно переопределить в потомке без специальных усилий? Это всего-лишь деталь реализации этого объекта.

Ой, спасибо, просветили меня темного. glare.gif Авторитетное мнение авторитетного автора, что тут скажешь. Особенно, учитывая "статические методы" в С++.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Вы в чисто процедурных языках вообще классы с функциями-членами встречали?

Это к чему вообще? Перевести тему в другую плоскость? Знакомо. Не получится.

Цитата(Oldring @ Apr 26 2007, 18:51) *
P.S. У меня игнор выборочный.

О! Это как??? Технически? Насколько знаю - игнор, он и есть игнор, мессаги заигнорированного участника физически не видны. Или вы экстрасенс? Научите такой игнор слабать? Хотя я игнором в принципе не пользуюсь, т.к. считаю это просто прятанием головы в песок, т.е. позицией трусливой и глупой. Но техническая реализация интересна.

Цитата(Oldring @ Apr 26 2007, 18:51) *
Иногда читаю сообщения, при малейшем сомнении не отвечаю. В споры вступаю по минимуму, когда вижу шанс человека посадить. biggrin.gif Вроде вас со Станиславом и еще узким кругом мне обычно неприятных собеседников.

Угу, только в этом топике в лужу-то сели как раз вы. Продемонстрировав незнание элементарных вещей, той же терминологии ЯП С++. И в топике Станислава (про конденсатор) мы тоже все видели, кто в луже. Ждем, когда Станислав продлжит ваше в ней купание.
Oldring
Цитата(dxp @ Apr 26 2007, 17:16) *
Естественно, потому что термин "метод" к С++ никакого отношения не имеет.
Вот именно. Всякая терминология имеет смысл и пользу, если она вносит ясность, а не путаницу. У Страуструпа все четко и ясно - мухи от котлет отделены: обычные функции-члены от виртуальных (полиморфных), а у вас путаница, все в куче.
Простой поиск в гугле и ваш личный опыт лишь подтверждают широту заблуждений по этому вопросу. Не надо спорить с автором. Он автор, это его детище, он ввел терминологию, и будьте любезны в рамках ++ ее придерживаться. Во избежание путаницы. То же самое касается и всяких "модулей" (вместо "единиц компиляции").

Еще разок напомню, что "статические методы класса" в С++ - есть нонсенс.
О! Вот это новость! Оказывается, книжки уже не авторитет. Очевидно, книжки классиков тоже. Ну-ну. Вместо четкого и ясного определения из первоисточников предлагается копаться в туче ссылок из поисковика, 90% которых в лучшем случае просто частные мнения каких-то неизвестных человеков. И относящихся по большей части не столько к С++, сколько к ООП вообще и другим языкам в частности (Java, C# и т.д.). Ценный совет, ничего не скажешь. Следование ему видно невооруженным взглядом.
Ой, спасибо, просветили меня темного. glare.gif Авторитетное мнение авторитетного автора, что тут скажешь. Особенно, учитывая "статические методы" в С++.
Это к чему вообще? Перевести тему в другую плоскость? Знакомо. Не получится.
О! Это как??? Технически? Насколько знаю - игнор, он и есть игнор, мессаги заигнорированного участника физически не видны. Или вы экстрасенс? Научите такой игнор слабать? Хотя я игнором в принципе не пользуюсь, т.к. считаю это просто прятанием головы в песок, т.е. позицией трусливой и глупой. Но техническая реализация интересна.
Угу, только в этом топике в лужу-то сели как раз вы. Продемонстрировав незнание элементарных вещей, той же терминологии ЯП С++. И в топике Станислава (про конденсатор) мы тоже все видели, кто в луже. Ждем, когда Станислав продлжит ваше в ней купание.



По поводу игнора - есть кнопка, просмотреть сообщение. Иногда сморю, когда долго не смотрел, или когда ввязался в обсуждение, как сейчас. Большей частью нет. Обычно оказывается, что ничего интересного все равно не было.

Да, именно, "как говорят" в книгах не описывают. Думаете, как толковые словари составляются.

Если теория опровергает практику - тем хуже для практики biggrin.gif
Legotron
Прошу прощения, что вклиниваюсь в столь жаркую дискуссию! smile.gif

Каков смысл статических функций класса? Зачем их следует использовать?
dxp
Цитата(Legotron @ Apr 27 2007, 17:58) *
Каков смысл статических функций класса? Зачем их следует использовать?

Главный смысл статических функций-членов классов - разгрузить глобальное пространство имен. Т.е., например, требуется какая-то функция, которая должна выполнять работу, не связанную непосредственно с объектами класса, но имеющую отношение к классу и его объектам (в целом). Например, надо проинициализировать что-то, но не в конструкторе класса, а уже внутри main. Например, проициализировать аппаратные регистры какого-то устройства (в ембеддед применениях). Обработчик прерываний тоже характерный пример - нестатическая функция-член класса не может быть обработчиком прерывания.

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

Второе отличие статической функции-члена класса от обычной функции (не члена класса) - статическая функция-член имеет доступ к не-public членам своего класса. Но это свойство для простой функции можно добыть, объявив ее другом (friend) класса.

Статическая функция-член живет своей жизнью и ее можно вызывать даже если не создано ни одного объекта класса. Т.е. точно как обычная функция.
Сергей Борщ
Цитата(dxp @ Apr 27 2007, 13:32) *
Ну и еще добавлю, что в нестатическую функцию-член неявно первым параметром передается указатель на экземпляр класса, а в статическую он не передается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.