LINUX.ORG.RU

Использование глобальных const char*

 


0

1

Будет ли такой код считаться хорошим подходом ?

static const char* gvar = NULL; //Здраво ли так объявлять глобальные char* ?
 
void func(){
 
    char path[4096];
    snprintf(path, sizeof(path), "%s%s", gvar, " - continued string ");
    
    printf ("String = %s\n", path);
}
 
int main(int argc, char *argv[]) {
 
    // .............
    if (gvar) {
        gvar = "One String";
    } else {
        gvar = "Second String";
    }
    // ............
 
    int my_condition = 1; // или 0
 
    if (my_condition) gvar = "Third String"; // просто пример, чтобы не раздувать код лишним
    func();
    return 0;
}

Есть ли вероятность , что моя строка gvar , затрется где когда нибудь другой белибердой ?

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

Во-первых, это не делает юнит-тесты бесполезными.

Во-вторых, юнит-тесты нужно уметь писать: должны быть кейсы с некорректными входными данными.

В-третьих, запуск юнит-тестов под valgrind и -Wall -Werror очень неплохо борются с очевидным UB, оставляя после себя разве что race conditions.

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

во вторых результат x++ + ++x; не обязан от чего-то зависеть, и вполне может быть таким, как ты предполагаешь. Но только на твоём локалхосте.

в третьих я и так вижу очевидные UB.

emulek
()
Ответ на: комментарий от kawaii_neko

Если не умеешь, то плохо. Если умеешь - прекрасно.

втыкать глобальные переменные любой дурак может. Что там уметь?

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

А недураки не ищут легких путей?

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

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

Да все ... я вас понял, чуваки, только как то неубедительно вы звучите... А emulek - это вообще нонсенс, толку никакого , только языком ляпать горазд :).

Но ты можешь дальше юзать, я не против

и буду :) А ты там хоть тресни... :) Давай печатай чувак ищо, чувак.. Число комментариев: 17691 - надеюсь кода ты своей жизни написал больше...

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

А emulek - это вообще нонсенс

Видел бы ты что он тут про криптографию писал. «Самые лучший алгоритмы — самые медленные».

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

Открой сорцы xxkb (индикатор раскладки такой), вообще ужаснешься, сколько там глобальных переменных. Только на ночь не читай, а то кошмары сниться будут.

PS

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

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

goto применимо всегда

Вот только порой вникать в мало-мальски большой плохо документированный код с кашей из goto, написанный давно или не тобой очень и очень не просто.

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

А недураки не ищут легких путей?

ты когда-нибудь слышал про поддержку кода?

Мне кажется, или тут сисадмины доказывают

тебе кажется. При чём тут сисадмины?

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

и как оно в прошлом веке?

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

FreakMurderer
() автор топика
Ответ на: комментарий от emulek

ты когда-нибудь слышал про поддержку кода?

Конечно. Порой синглтоны и статические переменные сильно упрощают код.

При чём тут сисадмины?

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

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

А emulek - это вообще нонсенс, толку никакого , только языком ляпать горазд :).

у тебя какие-то странные аргументы…

Давай печатай чувак ищо, чувак.. Число комментариев: 17691 - надеюсь кода ты своей жизни написал больше...

ты правильно надеешься.

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

«Самые лучший алгоритмы — самые медленные».

что не так? Быстрый алгоритм можно вскрыть тупым перебором. Кстати сравни скорость алгоритмов CRC32, MD5, SHA1 и SHA512. Это тебе домашнее задание. Как только сравнишь — возвращайся, обсудим криптостойкость.

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

у тебя какие-то странные аргументы…

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

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

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

Ты, например? Если ты писал хоть что-то больше hello world-а и что тебе потребовалось не раз написать и забыть (вроде лабы в ВУЗе), то ты должен понимать, что код пишется 1 раз, а читается и исправляется много раз. А вот тогда и вылезает вся прелесть глобальных переменных, операторов goto (единственное разумное применение им я вижу в выходе из сложных вложенных циклов) и отсутствия комментариев. Да, они сэкономят тебе время 1 раз, при написании, затем будут пить твою кровушку, когда тебе потребуется, к примеру, реализовать многопоточность и как можно быстрее. Всегда предугадать заранее, где потребуется правка кода нельзя.

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

тебе уже ответили: Использование глобальных const char* (комментарий)

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

некоторые вещи лучше делать как можно реже. И то, что какой-то древний быдлокодер когда-то понаствил глобальных переменных ни о чём не говорит. Тут тоже матом ругаются некоторые люди, которые не осилили русский литературный язык. И что? А лет 10 назад тут вообще мат-перемат был.

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

ЗЫЖ кстати я сам использую глобальные переменные, но довольно редко. И goto использую. Но тоже редко. Дело не в фанатизме, а в проблемах при поддержке кода.

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

Быстрый алгоритм можно вскрыть тупым перебором

CRC32, MD5, SHA1 и SHA512

MD5 «вскрывается» далеко не тупым перебором. Но есть предположить что математических проблем у алгоритма нет, то разницы тоже нет — они все будут выполняться одинаковое время. Напомню, речь шла про LUKS, в котором используется PBKDF2.

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

А вот тогда и вылезает вся прелесть глобальных переменных

а вся прелесть 20 с гаком параметров у функции (утрирую, но суть понятна) никак не вылезает , да ?

FreakMurderer
() автор топика
Ответ на: комментарий от emulek

Не, оно на чистом C. Вот кусочек:

/* Global variables */
Display *dpy;
#ifdef SHAPE_EXT
Bool shape_ext = False;
#endif
/* Local variables */
static int win_x = 0, win_y = 0, revert, base_mask;
static GC gc;
static XXkbConfig conf;
static Window root_win, main_win, icon, focused_win;
static Atom systray_selection_atom, take_focus_atom, wm_del_win_atom, wm_manager_atom, xembed_atom, xembed_info_atom, utf8_string_atom, net_wm_name_atom, net_window_type_atom;
static WInfo def_info, *info;
static kbdState def_state;
static XErrorHandler DefErrHandler;

/* Forward function declarations */
static ListAction GetWindowAction(Window w);
static MatchType GetTypeFromState(unsigned int state);
static Window GetSystray(Display *dpy);
static Window GetGrandParent(Window w);
static char* GetWindowIdent(Window appwin, MatchType type);
static void MakeButton(WInfo *info, Window parent);
static void IgnoreWindow(WInfo *info, MatchType type);
static void DockWindow(Display *dpy, Window systray, Window w);
static void MoveOrigin(Display *dpy, Window w, int *w_x, int *w_y);
static void SendDockMessage(Display *dpy, Window w, long message, long data1, long data2, long data3);
static void Reset(void);
static void Terminate(void);
static void DestroyPixmaps(XXkbElement *elem);

static void GetAppWindow(Window w, Window *app);
static WInfo* AddWindow(Window w, Window parent);
static void AdjustWindowPos(Display *dpy, Window win, Window parent, Bool set_gravity);
static Bool ExpectInput(Window win);

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

Более 5-и параметров — удел code monkey. Для всего остального есть one master struct.

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

а вся прелесть 20 с гаком параметров у функции (утрирую, но суть понятна) никак не вылезает , да ?

Оно хоть потокобезопасно и модули подключать не помешает. А сложность коду глобальные переменные также придают.

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

И то, что какой-то древний быдлокодер когда-то понаствил глобальных переменных

Я лучше доверюсь этому кодеру из признанного пакета, чем тебе, сорри чувак....

FreakMurderer
() автор топика
Ответ на: комментарий от peregrine

goto — мегаклассная вещь для выхода из вложенных циклов или для использования в макросах (чтобы перескочить в конец функции на деинициализацию). А еще в некоторых случаях используют longjump...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от peregrine

Да, они сэкономят тебе время 1 раз, при написании, затем будут пить твою кровушку, когда тебе потребуется, к примеру, реализовать многопоточность

У меня есть один объект, скажем обертка для доступа к БД, каким образом его явная передача во все функции избавит меня от необходимости синхронизации? Если я пишу код внутри фреймфорка, который не позволяет мне явно передавать объекты между частями?

А сделал его синглтоном при инициализации — ­и все проблемы решены.

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

Порой синглтоны

напоминаю, что это тема про сишку, расскажешь как в сишке сделать сингалтон?

и статические переменные сильно упрощают код.

…и усложняют отладку и сопровождение. С одной стороны конечно удобно откуда угодно обращаться к переменной, но с другой абсолютно непонятно, кто или что её испортили.

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

а ты выглядишь так, как будто пишешь в /dev/null. Т.е. тебя абсолютно не волнует судьба твоего кода. Как одностроки на баше: написал какую-то смесь из grep|sed|awk, лишь-бы работала, и забыл про неё. Так кто из нас сисадмин?

emulek
()
Ответ на: комментарий от peregrine

Терпеть не могу static вне функций! Что за дебилизм?

Ну, если не хочешь, чтобы к переменной/функции из других файлов был доступ — так не лепи их глобально, пихай внутрь какой-нибудь функции...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от FreakMurderer

Структура типа «context» со кучей переменных решит все проблемы.

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

А ничего, что в линуксе чуть ли не 90% "признанных пакетов" — прямо-таки эталон быдлокода и ламерства?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

ну да конечно, а идеалы кодинга - как раз на этом форуме обитают... Щас все брошу, и начну тебя, и этого чучмека слушать...

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

невнимательной и частой писаниной

на, вникай в недостатки глобальных переменных: Использование глобальных const char* (комментарий)

Этого тебе мало, да? Лично мне достаточно.

Вот и меня хотел ввести поначалу, но теперь уже не выйдет ... Бессовестный ты... :)

ага. Как и авторы Over9000 умных книжек по теме. Все сговорились, и отговаривают новичков от использования няшных goto и глобальных переменных, да. Это мы спецом, что-бы нам больше goto досталось!

emulek
()
Ответ на: комментарий от FreakMurderer

А тебя никто не заставляет. Хочешь дерьмо делать — делай. Хочешь по-нормальному — послушай, что советуют кодеры (меня не слушай, я вообще не погромист и никак к погромиздам не отношусь).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от emulek

напоминаю, что это тема про сишку, расскажешь как в сишке сделать сингалтон?

в сишке много чего можно сделать, кто-то и ООП прикручивает со свойствами и виртульными методами.

…и усложняют отладку и сопровождение.

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

Т.е. тебя абсолютно не волнует судьба твоего кода

Слишком «абсолютное» утверждение, и конечно мимо.

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

Я не спорю что есть недостатки. Недостатки есть всегда, а иногда есть и преимущества.. А теперь, потрудись, и в таком же стиле напиши про преимущества глобальных переменных.. Я не спорю что в процентном соотношении, глобальные перемененные стоит использовать реже, но ведь их придумали не просто так, и все таки их тоже используют, даже такие как ты ... А кое-кто больше...

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

а вся прелесть 20 с гаком параметров у функции (утрирую, но суть понятна) никак не вылезает , да ?

нет, не вылезает. Всё предельно ясно, ЧТО меняет данная функция. Да, если параметров много, можешь группировать их в структуры. А когда у тебя func();, то пока не найдёшь эту func() и её полностью не разберёшь, не поймёшь, что тут происходит.

Или ты за func() видишь, что оно gvar юзает read only? Ну а я магией не владею, увы.

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

Практически нереально найти место в коде, где глобальная меняется.

А что, grep уже не вариант?

который запускает inline функцию как errno.

errno имеет глобальную переменную, которую разные функции glibc изменяют. На тебе:

# ifndef __ASSEMBLER__
/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())
#  endif
# endif /* !__ASSEMBLER__ */
Как видишь, чтобы errno была своя для каждого потока, делается все очень просто: она — статическая переменная внутри функции __errno_location, которую я бы сделал так (лень смотреть исходники, и так все ясно):
int *__errno_location(){
    static int _inner_errno = 0;
    return &_inner_errno;
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от FreakMurderer

По крайней мере, лучше быдлокодеров, у которых 100500 глобальных переменных и такая жесть в коде!

// хотя, мой быдлокод тоже красотой не блещет. Можешь сам на сосфорже посмотреть на это уродство.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

goto — мегаклассная вещь для выхода из вложенных циклов или для использования в макросах

кстати макросы тоже плохо. И тоже из-за их глобальности.

emulek
()
Ответ на: комментарий от FreakMurderer

Я лучше доверюсь этому кодеру из признанного пакета, чем тебе, сорри чувак....

доверяй конечно. Аффтор после пары пива накатал по быстрому не слишком нужную утилиту, просто, что-бы было. Ясное дело, сервер через cal(1) не завалить, да и если сломается — не беда. И с тех пор в код почти не лазили, кому это надо? Мне не надо, я этой утилитой не пользуюсь, календарь есть в мобилке.

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

emulek
()
Ответ на: комментарий от Eddy_Em

Терпеть не могу static вне функций! Что за дебилизм?

нет, полезно. Хоть какая-то инкапсуляция.

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

Не тупи... Календарь - это просто один из примеров... lsblk — к примеру много посложней, и тоже очень много лет юзается мировым сообществом... НЕУБЕДИТЕЛЬНО !

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

lsblk

Но вдруг когда-нибудь понадобится lsblk, опрашивающий /proc в несколько потоков? А тут глобальные переменные!

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

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

FreakMurderer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.