Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Косяк у Кейла
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6
GetSmart
Цитата(Непомнящий Евгений @ Oct 24 2015, 16:06) *
Это расширение gcc такое.

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

Цитата(zltigo)
Олбанский?

zltigo стыдно не знать распостранённые диалекты Си.

Цитата(GetSmart)
Что на вызовы через декларации не выдаются даже ремарки по терминологии ИАРа - это однозначно сговор.

Конечно же только на вызовы с параметрами. Не предусмотреть даже ручную включалку - злодеяние.
Непомнящий Евгений
Цитата(GetSmart @ Nov 16 2015, 06:09) *
На первый взгляд, это какая-то лишняя сущность с нестандартным синтаксисом. Равноценно заменяется инлайн-функцией. Инлайн поддерживают все современные компиляторы. Имея все плюшки этой сущности и не ухудшая читабельность и красоту стандарта. goto изнутри круглых скобок во вне скобок - имхо бэд бэд стайл, особенно в макросе.


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

Код
void f() {
  int a, b;
  ...
  const int c = {  // константа со сложной формулой расчета
     int d = a + b + 42;
     if (d)
       d = g(d);
     if (d)
       d = q(d);
     d;
  }
}


В современных плюсах можно извернуться через замыкание
Код
void f() {
  int a, b;
  ...
  const int c = [&]{
     int d = a + b + 42;
     if (d)
       d = g(d);
     if (d)
       d = q(d);
     return d;
  }();
}

Arlleex
Добрый вечер. Есть вопрос по Keil.
Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке?
GetSmart
Цитата(Непомнящий Евгений @ Nov 16 2015, 19:33) *
К примеру

Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными? Насколько я понял из приведённого Вами описания "compound statement" с сайта gnu. И этот пример из серии за уши притягивания. В классическом Си такие значения хранились бы в переменных. В полноценном смысле константа - то, что расчитывается на этапе компиляции.

Во-вторых, инлайн честно может юзать локальные переменные вызывающей функции, только они должны передаваться через список аргументов функции. Это и стандартно и читабельно и безопасно. Для макроса по-другому опять же бэд бэд стайл. Когда будут прочитаны значения аргументов - зависит от атрибута volatile, без которого аргументы будут читаться в момент использования внутри функции или не читаться вообще. В большинстве случаев код будет не менее оптимально скомпилен.
Непомнящий Евгений
Цитата(GetSmart @ Nov 17 2015, 02:44) *
Разве в первом примере не нужны круглые скобки, окружающие блок с фигурными?

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

Что такое классический Си? Керниган и Ричи, первое издание? sm.gif Жизнь не стоит на месте. Там уже и атомики в стандарте появились, и bool, и константы времени исполнения. Конкретно эта штука - расширение gcc (в стандарте его нет)

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

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

Цитата
Для макроса по-другому опять же бэд бэд стайл.

Это как? Даже если у макроса есть аргументы, то там просто текстовая подстановка, аргументы будут "прочитаны" в момент обращения.

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


Цитата(Arlleex @ Nov 16 2015, 23:05) *
Неоднократно встречаю в проекте, что Keil подсвечивает некоторые #define красным крестиком, при наведении пишет undefined sybol. Но проект собирается. Не только #define, кстати, но и некоторые функции. Думаю и вы неоднократно замечали. Это, вообще говоря, как? Почему проект собирается, ведь это фатальная ошибка при сборке?


Кейлом не пользовался, но рискну предположить, что сборку делает компилятор, а данные для подсветки синтаксиса берутся из парсера самого кейла. Если этот парсер криво настроен (не видит каких-то инклюдов, предопределенных макросов и т.п.) или в нем есть баги - будут глюки с подсветкой и автокомплитом.
GetSmart
Цитата(Непомнящий Евгений @ Nov 17 2015, 09:44) *
Что такое классический Си?

В Си без этого расширения. Расширение действительно похоже на олбанский. Если бы была обозначена ярко выраженная польза, относительно Си без расширения, то базару нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.