|
|
  |
Вопросы по изучению Си |
|
|
|
Nov 18 2009, 15:45
|

кекс
     
Группа: Свой
Сообщений: 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 { }
|
|
|
|
|
Nov 19 2009, 07:52
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Herz @ Nov 18 2009, 23:26)  Хм, ну так не ставить его и всё.  Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос. Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить
|
|
|
|
|
Nov 19 2009, 20:47
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(Сергей Борщ @ Nov 19 2009, 11:38)  Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу... А почему сразу функции не писать? В смысле бывают ситуации когда без них не обойтись? ("инлайнизация" не в счёт, т.к. обычно легко решается этот вопрос).
|
|
|
|
|
Nov 19 2009, 23:53
|

кекс
     
Группа: Свой
Сообщений: 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 впустую.
|
|
|
|
|
Nov 20 2009, 10:02
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(defunct @ Nov 20 2009, 01:53)  Даже когда включена максимальная оптимизация и inline функция действительно инлайнится, все равно на практике встречаются ситуации когда макросы дают более эффективный код. Только что столкнулся как раз с таким. Keil (-O3, Otime ) отказался инлайнить очевидную функцию(static), даже __INLINE в этом случае не воспринял  , хотя в других местах за ним такого не замечал(постоянно слежу за получаемым кодом). Видимо решил сэкономить, т.к. подряд 10 "вызовов". В итоге "макросный" вариант выполняется в два раза быстрее... В предложенном первом примере, нельзя разве в функцию передать указатель(или ссылку) на поле? Хотя как поведет себя компилятор в таком случае конечно же вопрос, да и не очень эстетично выходит в целом. Примерно понятно в общем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|