LINUX.ORG.RU

По-настоящему важный вопрос

 ,


1

3

Куда вы ставите звёздочки и амперсанды при объявлении/инициализации указателей и ссылок, и почему?

  1. T* name, T& name
  2. T * name, T & name
  3. T *name, T &name
  4. Я талиб, я везде использую передачу по значению

P.S. Это не тупой наброс, мне правда интересно кто как делает, может есть весомые причины делать так или иначе, которые открываются с опытом.

Ответ на: комментарий от cudeta

Потому что glib хранит указатели на данные (key или value) там, где нужно хранить сами данные.

Нет, не нужно. Тогда будет невозможно поместить один объект в несколько разных контейнеров, что очевидно бывает необходимо не так уж редко.

wandrien ★★★
()
Ответ на: комментарий от wandrien
  1. хидер в файл его имплементирующий надо включать первым.
  2. предусловия функций надо писать до обьявления локальных переменных.
  3. переменные очень желательно декларировать в местах их инициализации.
alysnix ★★★
()
Ответ на: комментарий от wandrien

так надо писать когда платят за строки.

   if (fm_folder_view_get_folder(folder_view) != folder)
    {
        if (fm_folder_is_incremental(folder))
        {
            /* create a model for the folder and set it to the view
               it is delayed for non-incremental folders since adding rows into
               model is much faster without handlers connected to its signals */
            _folder_view_set_folder(page, folder);
        }
        else
        {
            fm_folder_view_disconnect_model_with_delay(folder_view);
        }
    }

а когда надо читать лучше писать так

   if (fm_folder_view_get_folder(folder_view) != folder) {
        if (fm_folder_is_incremental(folder)) {
            /* create a model for the folder and set it to the view
               it is delayed for non-incremental folders since adding rows into
               model is much faster without handlers connected to its signals */
            _folder_view_set_folder(page, folder);
        }
        else {
            fm_folder_view_disconnect_model_with_delay(folder_view);
        }
    }

alysnix ★★★
()
Ответ на: комментарий от alysnix

Многое я видел на лоре, но вот чтобы меня учили скобочки ставить, такого еще наверное не было.

Нет, второй вариант не читабельнее. И провоцирует ошибки.

wandrien ★★★
()
Ответ на: комментарий от alysnix
        if (fm_folder_is_incremental(folder)) {
            /* create a model for the folder and set it to the view
               it is delayed for non-incremental folders since adding rows into
               model is much faster without handlers connected to its signals */
            _folder_view_set_folder(page, folder);
        }
        else {
            fm_folder_view_disconnect_model_with_delay(folder_view);
        }

Не могу определиться с выбором мема:

  1. Ад для перфекционистов.
  2. Си для неуверенных.

Есть только два гендера. Либо:

if (cond)
{
    bla();
}
else
{
    bla();
}

Либо:

if (cond) {
    bla();
} else {
    bla();
}
wandrien ★★★
()
Ответ на: комментарий от wandrien

чисто вопрос. зачем в данном хидере, при наличии только gtkWindow инклудится весь gtk.h? впрочем может это какие-то особенности gtk? gtkWindow там в своем хидере

#ifndef _PREF_DLG_H_
#define _PREF_DLG_H_

#include <gtk/gtk.h>

G_BEGIN_DECLS

typedef enum {
    PREF_GENERAL,
    PREF_INTERFACE,
    PREF_LAYOUT,
    PREF_VOLMAN,
    PREF_ADVANCED
}PrefDlgPage;

void fm_edit_preference( GtkWindow* parent, int page );

G_END_DECLS

#endif
alysnix ★★★
()
Ответ на: комментарий от alysnix

чисто вопрос. зачем в данном хидере, при наличии только gtkWindow инклудится весь gtk.h?

Так положено. Смотри https://docs.gtk.org/gtk3/

Хотя нет, не смотри. Там срань господня с поломанными гиперссылками и разъехавшимся форматированием. Современные гномеры даже документацию отформатировать и выложить не могут без факапов.

Смотри лучше file:///usr/share/gtk-doc/html/gtk2/index.html в своём дистрибутиве.

wandrien ★★★
()
Ответ на: комментарий от wandrien

Там даже были какие-то реальные юзеры, которые собирали gtk-софт под какие-то древние юниксы середины-конца 90-х с древними компиляторами. В 2011-м году.

По крайней мере, мне так говорили. Сам не видел.

wandrien ★★★
()
Ответ на: комментарий от wandrien

Ну чисто технически, это вариант Страуструпа:

if (cond) {
    bla();
} 
else {
    bla();
}

В нем есть смысл, но мне удобней еlse на другую строку не переносить, т.е. вариант 1tbs, linux kernel.

soomrack ★★★★★
()

Каменты не читал.

1 и 3 оба хуже, 2 ваще хреновый. А чего вы собственно хотели, это ж C++.

Юзаю (1), т.к. сложности вроде A* b[] встречаются редко, а в простых случаях A* b звёздочка – часть типа. На самом деле я перестал метаться между (1) и (3) после того как услышал, что в яндексе принято (1). Хотя по ощущениям (например, по дефолтному поведению QtCreator), более распространённым является (3).

dimgel ★★★★★
()
Ответ на: комментарий от soomrack

это «modula-стайл»:

if (a) {
  ...
} else {
  ...
}

аналог

if a then
  ...
else
  ...
end 

но если в оригинале else выровнено с if и читается хорошо, то в сишечке else сьезжает вправо и читается уже хуже.

поэтому мы со страуструпом(!), сносим else на след. строку, чтобы выравнивалось с if.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)

T* Name; потому что читаю словами и удобнее воспринимается пара тип + имя_переменной.

К тому же бывает нужно приводить типы и в скобках пишут тип prt = (void*)var;, что совпадает с тип + имя_переменной, как и T* Name;.

Хочешь заставить всех в своем проекте делать единообразно? Уж лучше попроси писать более понятный и простой код, имхо это полезнее, чем придираться к всяким звездочкам.

Vic
()
Последнее исправление: Vic (всего исправлений: 3)

Проблема в сишечном синтаксесе by default. Его создатели гениальный в том, что сумели совместить красивые решения и максимально уродливые. Глядя на сишечку(и плюсы), с одной стороны, хочется похвалить его создателей, а с другой, хочется сделать им максимально больно.

WatchCat ★★★★★
()
Ответ на: комментарий от alysnix

gcc fanalyzer считает, что в этом фрагменте может происходить разыменование нулевого fpath:

_retry:
    if( _fm_file_info_job_get_info_for_native_file(fmjob, fi, fpath->str, &err) )
        fm_dir_list_job_add_found_file(job, fi);
    else /* failed! */
    {
        FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD);
        g_error_free(err);
        err = NULL;
        if(act == FM_JOB_RETRY)
            goto _retry;
    }

Мотивируя это следующим образом:

  'fm_dir_list_job_run_posix': events 34-37
    |
    |  290 |             if( _fm_file_info_job_get_info_for_native_file(fmjob, fi, fpath->str, &err) )
    |      |                                                                       ~~~~~~~~~~
    |      |                                                                            |
    |      |                                                                            (37) dereference of NULL 'fpath'
    |......
    |  296 |                 err = NULL;
    |      |                     ^
    |      |                     |
    |      |                     (34) 'fpath' is NULL
    |  297 |                 if(act == FM_JOB_RETRY)
    |      |                   ~  
    |      |                   |
    |      |                   (35) following 'true' branch (when 'act == 1')...
    |  298 |                     goto _retry;
    |      |                     ~~~~
    |      |                     |
    |      |                     (36) ...to here
    |

Если закоментировать строку err = NULL;, диагностика пропадает.

Продолжаю наблюдения.

wandrien ★★★
()
Ответ на: комментарий от wandrien
$ gcc --version
gcc (GCC) 13.2.1 20230801

Надо бы наверное этот false positive зарепортить. Но для этого надо собрать gcc из транка, проверить на нём, а потом уже репортить.

А собирать gcc это… Бе.

wandrien ★★★
()
Ответ на: комментарий от wandrien

ну в данном куске есть два вопроса.

  1. зануляется ли err перед проходом метки retry: сверху и первым вызовом _fm_file_info_job_get_info_for_native_file. вроде лучше поставить err = NULL сразу после метки, тогда вызов _fm_file_info_job_get_info_for_native_file будет всегда с инициализированной err. инициализировать надо поскольку нет формальной гарантии err будет установлен данной функцией всегда.

  2. а не равно ли fpath null и проверяется ли это?

alysnix ★★★
()
Ответ на: комментарий от wandrien
GString* fpath = g_string_sized_new(4096);

это не гарантия, что fpath != null

и даже если такая гарантия имеется, то если переменная подставлена куда-то в вызов по адресу, такая гарантия будет снята. поскольку ее там могут занулить.

это к рассуждениям, почему санитайзер может вдруг думать что null, … тут правда не видно, чтобы брали ее адрес в параметры.

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Я пробовал на эквивалентный вариант с while заменить, не помогло.

Вероятно, анализ выполняется после разложения на граф переходов, так что циклы он видит идентично, независимо от формы записи.

wandrien ★★★
()

Как в проекте принято, так и ставь. Code convention либо формально зафиксирован в документе, чтоб троллить нитаких как все, либо следует из кодовой базы и вообще не вызывает вопросов у нормальных людей.

anonymous
()
Ответ на: комментарий от wandrien

Классика багов на Си:

static gint _count_selected_files(FmFolderView* fv)
{
    FmDesktop* desktop = FM_DESKTOP(fv);
    GtkTreeModel* model = GTK_TREE_MODEL(desktop->model);
    GtkTreeIter it;
    gint n;
    if(!gtk_tree_model_get_iter_first(model, &it))
        return 0;
    do
    {
        FmDesktopItem* item = fm_folder_model_get_item_userdata(desktop->model, &it);
        CONTINUE_IF_ITEM_IS_NULL(item);
        if(item->is_selected)
            n++;
    }
    while(gtk_tree_model_iter_next(model, &it));
    return n;
}

Сам наговнокодил.

wandrien ★★★
()