Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > C/C++ Style


Автор: volkrey 5.6.2009, 13:49
Друзья, поделитесь своими стилями оформления кода(я понимаю, что есть у каждого на работе свои доки по стилю, но все же интересно)
мне интересно как Вы оформляете коменты

Автор: AZealot 30.6.2009, 12:28
Код

/*provides Foo, may be do nothing*/
void Foo()
{
    for (int i = 0; i < 500; ++i)
    {/*cycle calls Bar() 500 times*/
        Bar();
    }
}

Как то так. Не профессиональный программист, но, ИМХО, более менее читабельно получается.

Автор: 1000000dollars 30.6.2009, 12:51
Код

// Коммент для человека

/* коммент для временно исключённого кода
    int i;
*/

#if 0
всё, что угодно, но в основном код.
это коммент, для навсегда исключённого, кода, который тем не менее лучше бы не терять
#endif 


Автор: andrew_121 30.6.2009, 18:08
1000000dollars, Кстати не все!
Я однажды для удобства, впихнул http запрос в код, чтоб в другое окно не переключаться. Долго я не мог понять почему часть из запроса, включалась в компиляцию. Так и не понял. Пришлось в другом окне читать smile 

MSVS 2008.

Вот:
http://ipicture.ru/

Автор: nerezus 30.6.2009, 21:22
K&R

Автор: GrayCardinal 1.7.2009, 20:14
Цитата

мне интересно как Вы оформляете коменты

Комменты... в коде... хм  smile 

Автор: MAKCim 2.7.2009, 10:02
Цитата(GrayCardinal @  1.7.2009,  20:14 Найти цитируемый пост)
Комменты... в коде... хм

я, конечно, понимаю, что код по идее сам должен являться комментом, но иногда они (комменты) очень помогают
например, ты бы сходу понял сей код?
http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/kernel/sched.c#L1304
без маленького коммента сверху

Автор: Lazin 2.7.2009, 11:35
Цитата(nerezus @  30.6.2009,  21:22 Найти цитируемый пост)
K&R

smile

BSD
имена классов - с большой буквы, cammel case
имена переменных, методов, ф-ий - в нижнем регистре
имена констант, макросов - в верхнем регистре
имена закрытых переменных класса заканчиваются на _
отступ - 4 пробела, ворматирование пробелами
Код

class SomeClass
{
    int some_var_;
    static const int SOME_CONST = 0;
public:
    void some_method()
    {
        ....
    }
};

Автор: nerezus 2.7.2009, 12:51
И почему же user posted image?

Этот стиль отличается от Java-style только позицией { при классах и методах. Все остальное идентично.

Автор: andrew_121 2.7.2009, 13:22
Цитата(nerezus @  2.7.2009,  12:51 Найти цитируемый пост)
И почему же user posted image?

Вот и мне любопытно.
На* пустые строки? Или ЗП от кол-ва строк расчитывается?smile

Автор: Lazin 2.7.2009, 14:17
чисто субъективно - лучше читаемость

Код

if (somethint) {
    blablabla
}


Код

if (somethig)
{
    blablabla
}


мне первый вариант как-то глаза мозолит.. smile

Добавлено через 52 секунды
во втором варианте проще находить начало блока, если находишься в его конце, так как скобки имеют один уровень отступа

Автор: GrayCardinal 2.7.2009, 14:19
Цитата

например, ты бы сходу понял сей код?

Издеваешься ? там пять тыщ строк  smile 
Хотя если нормально смотреть, в виме к примеру, то можно разобраться smile

Добавлено через 2 минуты и 25 секунд
Lazin
Цитата

во втором варианте проще находить начало блока

smile

1. K&R is right
2. K&R is right

Добавлено через 2 минуты и 59 секунд
Цитата

Или ЗП от кол-ва строк расчитывается?

 smile 

Автор: nerezus 2.7.2009, 14:26
Цитата

мне первый вариант как-то глаза мозолит.. 
 А это не ты ли писал, что на питоне пробовал писать?)
Если ты, то обманул таки )

Цитата

например, ты бы сходу понял сей код?
  По моему мнению, это плохой код.
Его надо разбить на классы по ~200 строк максимум для улучшения читаемости.

Автор: bsa 2.7.2009, 14:51
Цитата(nerezus @ 2.7.2009,  14:26)
Цитата

например, ты бы сходу понял сей код?
  По моему мнению, это плохой код.
Его надо разбить на классы по ~200 строк максимум для улучшения читаемости.

это кусок исходного текста ядра Linux. Оно написано на Си. В Си нет классов. Если каждый файл там разбивать на мелкие по 200 строк, то файловая система умрет при распаковке.

Автор: Lazin 2.7.2009, 14:54
Цитата(nerezus @  2.7.2009,  14:26 Найти цитируемый пост)
А это не ты ли писал, что на питоне пробовал писать?)
Если ты, то обманул таки )

там таких проблем нет, потому-что нет скобок xD
Код

if (first)
{
    foo(first);

    if (second)
    {
        int a = 42;
        bar(a);
    }
    printf("done!!!");
}

сравни с этим и представь, что кода больше.. его намного больше!! smile 
Код

if (first) {
    foo(first);
    if (second) {
        int a = 42;
        bar(a);
    }
    printf("done!!!");
}


Цитата(GrayCardinal @  2.7.2009,  14:19 Найти цитируемый пост)
1. K&R is right
2. K&R is right

 smile 
короче я ничего не понял, что ты хочешь этим сказать...

в общем, это дело вкуса..

Автор: GrayCardinal 2.7.2009, 15:31
Lazin
Любой уважающий себя редактор подсвечивает конец блока....

Автор: andrew_121 2.7.2009, 18:57
Цитата(Lazin @  2.7.2009,  14:17 Найти цитируемый пост)
мне первый вариант как-то глаза мозолит..

Установите табуляцию 2-3 и блок будет выделяться.
Цитата(nerezus @  2.7.2009,  14:26 Найти цитируемый пост)
 По моему мнению, это плохой код.
Его надо разбить на классы по ~200 строк максимум для улучшения читаемости.

Это ты плохой smile 
Какие классы?!!! Это С !

Автор: Lazin 2.7.2009, 20:37
Цитата(andrew_121 @  2.7.2009,  18:57 Найти цитируемый пост)
Установите табуляцию 2-3 и блок будет выделяться.

табуляция в 2-3 пробела? что там будет выделяться кроме попытки выделяться? smile 

Автор: nerezus 2.7.2009, 20:45
Цитата

Если каждый файл там разбивать на мелкие по 200 строк, то файловая система умрет при распаковке.
 О да, пусть будет на 2 минуты быстрее у юзверей распаковываться, чем читаться нормально.

Цитата

Оно написано на Си. В Си нет классов
 Т.е. ты сам признал, что код на C плохо читаем?) Просто помню, ты о C++ говорил, что это лишь синтаксический сахар ;)

Цитата

там таких проблем нет, потому-что нет скобок xD

"{" == ":"
"}" == ""(пусто)
т.е. код такой же, как в питоне, если считать скобки пустым местом, а смотреть лишь на строки.


Код

if (first) {
    foo(first);
    if (second) {
        int a = 42;
        bar(a);
    }
    printf("done!!!");
}


Код

if (first):
    foo(first);
    if (second):
        int a = 42;
        bar(a);

    printf("done!!!");
}

Сравни ) P.S. синтаксис не приводил )
Мне второй вариант больше нравится - он компактнее, а на скобки никогда внимания не обращаю, смотрю лишь на реализуемые отступы.
Если же при { будет пустая строка, то кажется, как будто блок закончен, что не так )


Автор: andrew_121 2.7.2009, 21:42
Цитата(Lazin @  2.7.2009,  20:37 Найти цитируемый пост)
что там будет выделяться кроме попытки выделяться?

Прикольная фраза получилась smile 


nerezus, Ты случаем не мусар? Помнишь что Лазин когда-то где-то писал, и за мной следишь? Неа, скорее ты извращенец. smile 


Цитата(nerezus @  2.7.2009,  20:45 Найти цитируемый пост)
Т.е. ты сам признал, что код на C плохо читаем?)

Да еще и зануда.

Автор: MAKCim 3.7.2009, 09:42
GrayCardinal
не, я про одну функции calc_delta_mine ;)

по сабжу мой выбор linux/Documentation/CodingStyle
по работе так
Код

typedef struct some_struct
{
    //
    int variable_1;
    //
    void (*super_callback_2)(int argument_1);
}
t_some_struct;
...
static void private_module_function_1(int argument_1, t_some_struct *argument_2)
{
    int i;
    
    for (i = 0; i < 10; ++i)
    {
        printf("%d\n", i);
    }

     if (i == 10)
     {
         ++i;    
     }
}
...
int public_module_function_1()
{
    private_module_function_1(0, NULL);

    {
        t_some_struct local_variable_1;
 
        private_module_function_1(1, &local_variable_1);
    }
}

Автор: proc_maker 17.8.2010, 14:44
embedded С++. Мы руководствуемся MISRA - очень грамотная вещь.

Из такого что быстро приходит на ум - запрещено использование табуляторов - пробелы. Комменты в стиле doxygen.

Запрещено использование STL и эксепшнов, единый выход из функции, лимит на глубину колво скопов в функции, лимит на длину строки кода, запрет continue, оператора запятая. Нет пробела между именем функции и открывающей скобкой при вызове. Нет пробелов перед запятыми и точками, точками с запятой. Запрещены куски заремаренного кода (золотое с моей точки зрения правило). Один класс - cpp + hpp файл.

Я лично предпочитаю стиль
if (X)
{
   f();
} else
{
   f();
}

Кажется более интуитивно понятным

Автор: Rad87 18.8.2010, 13:29
Ну у вас и жесткий кодестайл.....  больше всего вопросов к единому выходу из функции и к continue.
Как вы работаете с этими ограничениями?  на мой взгляд от этого только усложняется код.

Автор: A5uKa 18.8.2010, 14:03
Странная тема ... ну вот как я оформляю... (у меня очень мало комментариев)

Код

                for (int i=7; i<=temp.Length(); i++)
                tempN+=temp[i];
                Edit9->Text="Ëèíèÿ "+String(StrToInt(tempN)+1);

                MainTree->Select(MainTree->Items->AddChild(MainTree->Selected, Edit9->Text));
                }
                else
                {
                MainTree->Select(MainTree->Items->AddChild(MainTree->Selected, "Ëèíèÿ 1"));
                Edit9->Text="Ëèíèÿ 1";
                }
                }
                else
                {
                MainTree->Select(MainTree->Items->AddChild(MainTree->Selected, "Ëèíèÿ 1"));
                Edit9->Text="Ëèíèÿ 1";
                }
                Edit11->Text="";
                //работает.    //XD

                TCAT->Selected->ImageIndex=27;

                CfgIzmeritel->Close();
                CheckBox5->Checked=true;


Код

NeedToAddFolder=true;
                        }
                        else
                        {
                //------------------------------------------------
                //Ищу дочнрнюю папку, которая есть !
                TTreeNode *tempTree = MainTree->Selected;
                for (int i=0;i<tempTree->Count;i++)
                {
                        MainTree->Select(tempTree->Item[i]);

Автор: proc_maker 18.8.2010, 14:14
Цитата(Rad87 @  18.8.2010,  13:29 Найти цитируемый пост)
больше всего вопросов к единому выходу из функции и к continue.
Как вы работаете с этими ограничениями?  на мой взгляд от этого только усложняется код. 


Как ни странно, но я для себя понял что единый выход из функции очень удобен и решает много проблем к примеру благодаря такой вот конструкции:

Код

int f()
{
   int res = -1;
   do
   {
     if (true == wrong_1)
     {
         printf();
         break;
     }

     if (true == wrong_2)
     {
         printf();
         break;
     }
...

      // Now we know everithing is fine!!! - Do our work
      ret = 0;
   } while (0);

   return ret;
}


continue тоже лечится таким же образом:

Код

for ()
{
   do
   {
      // Do something

      if (true == needContinue)
      {
            break;
      }
   } while(0);
}


Как в половой жизни - раз приучил себя не писать как попало - и дальше не имеешь лишней головной боли разного рода.

Добавлено через 8 минут и 24 секунды
Цитата(A5uKa @  18.8.2010,  14:03 Найти цитируемый пост)
for (int i=0;i<tempTree->Count;i++)


мы пишем так:

for (int i = 0; tempTree->Count > i; ++i)

А еще у нас скобки обязаны быть во всех if while case etc.
if ()
{
   a = 0;
}

Автор: A5uKa 18.8.2010, 15:52
Цитата

мы пишем так

Ну один знакомый у меня скобки ставит вообще просто так, что бы выделить что-то ... 
Если пишешь код в одиночестве главное там потом не запутаться ... 
Ну в моём случае это неосуществимо  smile 

Автор: Dem_max 19.8.2010, 09:14
Код

for ()
{
   do
   {
      // Do something

      if (true == needContinue)
      {
            break;
      }
   } while(0);
}


а потом ищешь где у тебя функция зависла и за того что стоит бесконечный цикл.

А какое отношение к оператору  goto ?

Автор: proc_maker 19.8.2010, 10:15
>> а потом ищешь где у тебя функция зависла и за того что стоит бесконечный цикл.
А где тут бесконечный цикл кстати? smile

Цитата(Dem_max @  19.8.2010,  09:14 Найти цитируемый пост)
А какое отношение к оператору  goto ? 


Запрещено.

Я никого не уговариаю на эту конструкцию, поймите. Лично я нашел в ней больше плюсов чем минусов, поэтому стараюсь ее применять везде где возможно, потому что она с моей точки зрения максимально красиво реализует подход: если мы на этой строке значит все проверки прошли успешно.

Автор: Dem_max 19.8.2010, 11:28
а что за конструкция такая с while(0); ?

может вместо 
Код

   do
   {
     if (true == wrong_1)
     {
         printf();
         break;
     }

     if (true == wrong_2)
     {
         printf();
         break;
     }
...

      // Now we know everithing is fine!!! - Do our work
      ret = 0;
   } while (0);


проще написать
Код

     if (true == wrong_1)
     {
         printf();
         break;
     }

     if (true == wrong_2)
     {
         printf();
         break;
     }
...

      // Now we know everithing is fine!!! - Do our work
      ret = 0;

Автор: proc_maker 19.8.2010, 14:37
Цитата(Dem_max @ 19.8.2010,  11:28)
а что за конструкция такая с while(0); ?

проще написать
Код

     if (true == wrong_1)
     {
         printf();
         break;
     }

     if (true == wrong_2)
     {
         printf();
         break;
     }
...

      // Now we know everithing is fine!!! - Do our work
      ret = 0;

Да, только чтобы юзать break он должен быть внутри цикла - иначе придется использовать return или goto. Вот while(0) и позволяет это делать не прибегая к циклу как к таковому smile

Автор: Dem_max 19.8.2010, 16:45
просто жесть

Автор: djamshud 20.8.2010, 15:42
proc_maker, то, что вы написали - не codestyle, а идея ради идеи. Зачем одни лаконичные конструкции заменять другими радутыми, но функционально эквивалентными?

http://pastebin.com/NEQJdJ10 (http://pastebin.com/60dcWK7m).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)