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

 
 
7 страниц V  « < 5 6 7  
Reply to this topicStart new topic
> Вопросы по изучению Си
defunct
сообщение Nov 18 2009, 15:45
Сообщение #91


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Herz @ Nov 18 2009, 17:39) *
Разве? Почему?


Код
if (1)
{
};
else
{
}

потому что - Syntax error near 'else'. ";" после закрывющей скобки это уже второй оператор (пустой оператор), а else получается как сам по себе.
верхнее равносильно такому:
Код
if(1)
{
   foo1();
}
foo2();
else
{
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 18 2009, 15:59
Сообщение #92


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Herz @ Nov 18 2009, 20:39) *
Разве? Почему?
Потому, что между if и else знак ";" (точка с запятой) встречается.
Go to the top of the page
 
+Quote Post
Herz
сообщение Nov 18 2009, 20:26
Сообщение #93


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(rezident @ Nov 18 2009, 17:59) *
Потому, что между if и else знак ";" (точка с запятой) встречается.


Хм, ну так не ставить его и всё. laughing.gif Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос.
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 19 2009, 07:52
Сообщение #94


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Herz @ Nov 18 2009, 23:26) *
Хм, ну так не ставить его и всё. laughing.gif Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос.
Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить crying.gif
Go to the top of the page
 
+Quote Post
Herz
сообщение Nov 19 2009, 08:18
Сообщение #95


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(XVR @ Nov 19 2009, 09:52) *
Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить crying.gif


Если забыли, компилятор такого точно не пропустит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2009, 09:38
Сообщение #96


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 19 2009, 20:47
Сообщение #97


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(Сергей Борщ @ Nov 19 2009, 11:38) *
Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу...

А почему сразу функции не писать? В смысле бывают ситуации когда без них не обойтись? ("инлайнизация" не в счёт, т.к. обычно легко решается этот вопрос).
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 19 2009, 23:53
Сообщение #98


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(baralgin @ Nov 19 2009, 22:47) *
В смысле бывают ситуации когда без них не обойтись?

Даже когда включена максимальная оптимизация и 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 впустую.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 20 2009, 10:02
Сообщение #99


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

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(defunct @ Nov 20 2009, 01:53) *
Даже когда включена максимальная оптимизация и inline функция действительно инлайнится, все равно на практике встречаются ситуации когда макросы дают более эффективный код.

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

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

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:53
Рейтинг@Mail.ru


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