|
|
  |
Стиль программирования на Си, описание функции |
|
|
|
Apr 2 2008, 09:58
|

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

|
Цитата(ReAl @ Apr 1 2008, 15:40)  Но ведь никто не рекомендует отказаться от них и начать писать p = p + 1; Или уже рекомендуют?  Delphi'сты рекомендуют  Цитата(dxp @ Apr 1 2008, 15:50)  Как насчет вышеприведенного примера про Код #define I 7 #define N 2 #define C 0 ? Я еще люблю применять #define K 1024 #define M K*K Просто кому придет в голову объявить переменную ОДНОЙ ЗАГЛАВНОЙ буквой? Цитата(SasaVitebsk @ Apr 2 2008, 00:17)   А мне так понравилось. По сравнению с Паскалем, к примеру.  ++ / -- - просто создан для индексации массивов. тоже неплохо смотрится в условиях. а повсеместно тыкать ++ / -- ни ни, я отдаю предпочтение p += 1 вместо ++;
|
|
|
|
|
Apr 2 2008, 11:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(zltigo @ Apr 1 2008, 22:44)  Самостоятельные препроцессоры "C" не редкость, да и тем-же GCC прогнать можно... Посему на везение уповать совсем незачем  . Тут можно спорить о возможном несовпадении (один из них или оба могут не польностью соответствовать стандрату и проверка одним другого будет неадекватной). Но в целом он чаще есть, чем его нет. Я их даже эпизодически прикручивал для своих нужд (например, в pldasm какие-то кусочки пихал для облегчения написания). Цитата(zltigo @ Apr 1 2008, 22:44)  А почему-бы и нет? Есть свои приятственные фичи в C++ компиляторах и для почти сишного кода. А как, например в смешанном коде без немерянных извращений работать с плюсовым кодом? Лично я в большинстве случаев так и поступаю. Это если говорить о сложившейся ситуации. И я тоже так делаю иногда, хотя и inline-функции, и объявление переменных по месту, включая счётчики в циклах for - есть в C99, просто до сих пор не все поддерживают. Да и в С99 есть не менее вкусная возможность инициализировать элементы структур/массивов по имени, в С++ этого нет. Так что... Где найдёшь, где потеряешь... А если говорить на момент "до того", когда язык С++ только сбивался и ещё и люди не привыкли пользоваться "С-совместимыми" расширениями С++, и "массы текстов" не набралось, то кто мешал "таки повыкидывать из С++ тяжкое наследие С, не приносящее ничего, кроме вреда"? По поводу смешанных проектов - никто не мешает весь С-текст держать в отдельных файлах, компилировать в С-режиме со всеми функциональными макросами, а потом линковать с С++ - программой, скомпилированной в С++ режиме. Ввели бы для условной компиляции что-то как-бы похожее, но интегрированное в язык, а не являющееся отдельным проходом. Как результат в условии компиляции можно было бы применять и enum-определённые константы и т.п. Кто мешал? И не было бы споров  Ну скучал бы я по старым добрым макросам  Цитата(_Pasha @ Apr 2 2008, 08:58)  А насчет пред/пост инкремента, например, действительно генератор граблей. Где? Как? Может, генератором граблей есть голова пишущего, не разобравшаяся в побочных эффектах и точках следования? Если так, то надо требовать изменения консти стандарта С таким образом, чтобы все переменные по умолчанию были volatile, так как от непонимания этого момента "глюков" ещё больше. Ну или просто компилировать свои программы с выключенной оптимизацией. Цитата(defunct @ Apr 2 2008, 11:58)  а повсеместно тыкать ++ / -- ни ни, я отдаю предпочтение p += 1 вместо ++;  Шаманим потихоньку? Стандарт С: Цитата 6.5.3.1 Prefix increment and decrement operators ... Semantics 2 The value of the operand of the prefix ++ operator is incremented. The result is the new value of the operand after incrementation. The expression ++E is equivalent to (E+=1). See the discussions of additive operators and compound assignment for information on constraints, types, side effects, and conversions and the effects of operations on pointers. 3 The prefix -- operator is analogous to the prefix ++ operator, except that the value of the operand is decremented. Цитата 6.5.16.2 Compound assignment Semantics 3 A compound assignment of the form E1 op= E2 differs from the simple assignment expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once. ++E эквивалентно E+=1 всегдалюбое из них эквивалентно E = E + 1 в подавляющем большинстве случаев. Разница будет, например, для a[i] += 1; в случае, когда i объявлено как volatile, иначе выражения семантически эквивалентны.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 2 2008, 12:15
|

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

|
Цитата(ReAl @ Apr 2 2008, 13:55)   Шаманим потихоньку? ++E эквивалентно E+=1 всегдаЭто я в курсе  Дело принципа и привычки, от ++ в глазах рябит. Как и написал выше ++/-- использую только для индексации и в условиях: while( zz--) { *p++ = xx; p[ idx++] = xx; } ... а когда стоит вопрос одинокого инкремента какой-то переменной или указателя то пользую p += 1;
|
|
|
|
|
Apr 2 2008, 12:40
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(defunct @ Apr 2 2008, 14:15)  Это я в курсе  Дело принципа и привычки, от ++ в глазах рябит. Фух, а то я уж, виноват, подумал, что это способ уменьшения размера глюкодрома по причине врождённой глюкавости операторов ++ --. Привычки - это нормально, ненормально когда их оправдывают высокими соображениями
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 2 2008, 16:40
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Позволю небольшой отрывок кода, извиняюсь что немного прерываю... доступ к флагам Код /**************************************************************************** Системные флаги ****************************************************************************/ #define System_Flags GPIOR0 enum { KEY_VALID = (1 << 0), NEED_FLASH = (1 << 1), SOUND_ENABLE = (1 << 2) };
void main (void){ if(System_Flags & KEY_VALID) System_Flags &= ~NEED_FLASH; if(System_Flags & NEED_FLASH) System_Flags &= ~SOUND_ENABLE; }; тот же код но с препроцессором Код #define System_Flags GPIOR0 #define KEY_VALID (1 << 0) #define NEED_FLASH (1 << 1) #define SOUND_ENABLE (1 << 2) void main (void){ if(System_Flags & KEY_VALID) System_Flags &= ~NEED_FLASH; if(System_Flags & NEED_FLASH) System_Flags &= ~SOUND_ENABLE; }; Даёт одинаковый код Код // 18 if(System_Flags & KEY_VALID) System_Flags &= ~NEED_FLASH; SBIC 0x1E, 0x00 CBI 0x1E, 0x01 // 19 if(System_Flags & NEED_FLASH) System_Flags &= ~SOUND_ENABLE; ??main_0: SBIC 0x1E, 0x01 CBI 0x1E, 0x02
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Apr 2 2008, 19:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(SasaVitebsk @ Apr 2 2008, 21:34)  ... совершенно очевидно, что компилятору по барабану написали ли вы формулу одним оператором или тремя. Качество сгенерированного кода не ухудшится Компиляторы умнеют, но тем не менее пока не умнее Вас и на подсказку вполне вероятно, ответят лучшим кодом. Цитата(singlskv @ Apr 2 2008, 22:19)  Более того, при написании 3мя операторами оно может и существенно улучшиться  если знаешь как правильно разбить эти 3 оператора на нужное количество строк... Вы знаете? Тогда пример в студию...... Цитата(_Pasha @ Apr 2 2008, 21:53)  Поэтому, когда мне закинут в уши мысль типа...  ну зачем-же гордится своей наивностью?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|