defunct 0 18 ноября, 2009 Опубликовано 18 ноября, 2009 · Жалоба Разве? Почему? if (1) { }; else { } потому что - Syntax error near 'else'. ";" после закрывющей скобки это уже второй оператор (пустой оператор), а else получается как сам по себе. верхнее равносильно такому: if(1) { foo1(); } foo2(); else { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 18 ноября, 2009 Опубликовано 18 ноября, 2009 · Жалоба Разве? Почему?Потому, что между if и else знак ";" (точка с запятой) встречается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 5 18 ноября, 2009 Опубликовано 18 ноября, 2009 · Жалоба Потому, что между if и else знак ";" (точка с запятой) встречается. Хм, ну так не ставить его и всё. :laughing: Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Хм, ну так не ставить его и всё. :laughing: Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос.Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 5 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить :crying: Если забыли, компилятор такого точно не пропустит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Если забыли, компилятор такого точно не пропустит.Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу, исправляя непонятно откуда появившиеся ошибки? Не проще ли сразу написать в макросе do {} while(0) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
baralgin 0 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу... А почему сразу функции не писать? В смысле бывают ситуации когда без них не обойтись? ("инлайнизация" не в счёт, т.к. обычно легко решается этот вопрос). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 19 ноября, 2009 Опубликовано 19 ноября, 2009 · Жалоба В смысле бывают ситуации когда без них не обойтись? Даже когда включена максимальная оптимизация и 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 впустую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
baralgin 0 20 ноября, 2009 Опубликовано 20 ноября, 2009 · Жалоба Даже когда включена максимальная оптимизация и inline функция действительно инлайнится, все равно на практике встречаются ситуации когда макросы дают более эффективный код. Только что столкнулся как раз с таким. Keil (-O3, Otime ) отказался инлайнить очевидную функцию(static), даже __INLINE в этом случае не воспринял :crying: , хотя в других местах за ним такого не замечал(постоянно слежу за получаемым кодом). Видимо решил сэкономить, т.к. подряд 10 "вызовов". В итоге "макросный" вариант выполняется в два раза быстрее... В предложенном первом примере, нельзя разве в функцию передать указатель(или ссылку) на поле? Хотя как поведет себя компилятор в таком случае конечно же вопрос, да и не очень эстетично выходит в целом. Примерно понятно в общем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться