Перейти к содержанию
    

Вопросы по изучению Си

Разве? Почему?

 

if (1)
{
};
else
{
}

потому что - Syntax error near 'else'. ";" после закрывющей скобки это уже второй оператор (пустой оператор), а else получается как сам по себе.

верхнее равносильно такому:

if(1)
{
   foo1();
} 
foo2();
else
{
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому, что между if и else знак ";" (точка с запятой) встречается.

 

Хм, ну так не ставить его и всё. :laughing: Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм, ну так не ставить его и всё. :laughing: Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос.
Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить :crying:

 

Если забыли, компилятор такого точно не пропустит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если забыли, компилятор такого точно не пропустит.
Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу, исправляя непонятно откуда появившиеся ошибки? Не проще ли сразу написать в макросе do {} while(0) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу...

А почему сразу функции не писать? В смысле бывают ситуации когда без них не обойтись? ("инлайнизация" не в счёт, т.к. обычно легко решается этот вопрос).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле бывают ситуации когда без них не обойтись?

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

 

Бывают еще такие ситуации:

 

file1.h:

#include "file2.h"

typedef struct 
{
   ...
   ..
   .
   some_file2_enum_type field_n;
   ..
} some_complex_struct_t;

А в file2.h ну очень хочется объявить функцию которая работает с field_n из file1.h, а подключить file1 низя. Макрос спасает.

 

 

Или вот конкретная ситуация, хотим чтобы string литерал не занимал RAM впустую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Только что столкнулся как раз с таким. Keil (-O3, Otime ) отказался инлайнить очевидную функцию(static), даже __INLINE в этом случае не воспринял :crying: , хотя в других местах за ним такого не замечал(постоянно слежу за получаемым кодом). Видимо решил сэкономить, т.к. подряд 10 "вызовов". В итоге "макросный" вариант выполняется в два раза быстрее...

 

В предложенном первом примере, нельзя разве в функцию передать указатель(или ссылку) на поле? Хотя как поведет себя компилятор в таком случае конечно же вопрос, да и не очень эстетично выходит в целом. Примерно понятно в общем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...