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 , затрется где когда нибудь другой белибердой ?

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

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

идиотизм ИМХО. Апофеоз костылизма. Но я не вижу смысла в идиоме «одиночка» в рамках pure C.

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

придумал, да? Callback это не самая сильная сторона сишки, как и вообще указатели на функции. Особенно в чужом коде.

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

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

тогда почему ты не хочешь облегчить себе отладку и сопровождение? Тут уже сказали, что писать нужно всего один раз, а переделывать — много раз. Вот у тебя и получится что-то типа cal(1), куда никто не лезет, ибо проще с нуля переписать.

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

Особенно в чужом коде

Чужой код есть, и с ним нужно работать. Иногда варианта «сменить библиотеку» просто нет.

придумал, да?

В твоей практики такого не было?

Вот у тебя и получится что-то типа cal

Нет, не получится. Я же не делаю _все_ переменные глобальными.

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

А теперь, потрудись, и в таком же стиле напиши про преимущества глобальных переменных..

преимущества мне неизвестны. По быстрому код подправить, разве что. Когда лениво разбираться, и нужно ВНЕЗАПНО добавить новую фичу. Но такой костылизм всегда выходит боком.

Ещё тут про костыли для callback говорили.

Для отладки полезно, если огородить всё это

#ifdef DEBUG…#endif

но ведь их придумали не просто так

в сишке полно legacy непонятно зачем нужного. Такого как auto. Register тоже не юзают много лет, компилятору виднее, что делать регистром. Ну ещё signed. Ну и не забывай, раньше такты и байты считали. По одному. Глобальная память это просто ячейка с абсолютным адресом, а локальная автоматическая — стек, в котором ещё нужно базу и смещение указать. Сейчас это делается за полтакта одной командой, а раньше это было много команд и тактов. Ещё и регистры приходилось портить, которых было всего штук шесть или типа того (вообще говоря обычно 8, но указатель стека и команды не считается). В итоге глобальная переменная получалась намного дешевле, нежели стековая. Сейчас разницы нет(на x86).

также если НЕЧТО требуется передать в сотни функций. Например опции из конфига и командной строки.

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

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

угу. Единственный(ну или поиск в редакторе).

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

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

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

Ну не будет гемора, если пару этих переменных среди ста локальных , не будет, че хочь пиши ))

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

http://eprint.iacr.org/2006/105

сколько ещё объяснять, что коллизии ≠ взлом? Они ничего полезного не дают злоумышленнику. Можно сделать два разных файла с одной md5, и один из файлов будет вредоносом, но только если второй _тоже_ содержит вредоносный код.

Короче, учи матчасть и не позорься.

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

Проблема не в макросах, а в отсутствии неймспейсов в C.

а ещё нет классов и шаблонов.

и перегрузки операторов. и виртуальных функций. И многого ещё.

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

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

вот ты не поверишь, я как-то без неё обходился. Достаточно mount, df.

И да, я тебя не убеждаю. Наоборот, юзай. Сам же потом будешь мучиться.

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

В твоей практики такого не было?

очень редко.

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

Против этого ничего не имеешь ? https://github.com/karelzak/util-linux/blob/master/misc-utils/cal.c#L79

это глобальные, которые видны по всему модулю трансляции (в данной программе всего один модуль, потому смысла в static нет).

Статические, это которые внутри функций.

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

Сам же потом будешь мучиться.

Сомневаюсь... с-о-м-н-е-в-а-ю-с-ь !

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

Какие могут быть проблемы в so?

ну как какие.. понятное дело — «Состояние гонки» :)

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

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

Ага, а потом за таким вот simple и stupid, ищешь, где он глобальные данные в 12 местах из разных потоков меняет,потратив на отлов очередного гейзенбага часов эдак надцать и думаешь, что убил бы. Писатели хеллоуворлдов такие писатели, да

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

перестань путать статическую и глобальную

Фактически это — те же яйца! Просто компилятор скрывает ее от других функций.

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

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

Нафиг он мне нужно — тудым-сюдым строки кидать, если можно просто использовать strtok_r?

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

А я к тебе претензий и не имею.

Просто ТС, насмотревшись этой жести, решил почему-то, что такой код — вершина совершенства и все дела. Хоть бы почитал K&R и Макконелла.

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

Фактически это — те же яйца! Просто компилятор скрывает ее от других функций.

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

int global_var;


// где-то в 1234й строке
f(&global_var);

// где-то в over9000й строчке
void f(int* p)
{
  *p = 17;
}

Или ещё по-круче, когда функция принимает const int*, но внутри потом говнокодер решил добавить фичу, и сделал каст в неконстантный (int*). Вот смотришь как баран на функцию: вроде const, но параметр меняется. ВНЕЗАПНО. Это когда до функции догрепаешь конечно.

а с случае статической нужно сначала найти ее объявление и убедиться

Не нужно. Не нужно вообще возвращать static переменную (указатель на неё). Ну и вообще, эти static полезны только на отладке и для рекурсии. А так от них больше проблем, чем профита.

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

Эта либа лепится к однопоточным только.

а это уже не спрашивают у библиотеки!

если разработчик сказал нам что функции библиотеки НЕ являются threadsafe , ...

...то это значит что к одной и той же *задаче* — нельзя вызывать библиотечные функции из разных Нитей.

но, если, простите, разработчик библиотеки запрещает мне делать -pthread  — то такому разрабу только плюнуть в лицо.

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

Потом можно писать в них только однократно:
При инициализации переменная - 0.
При первом исп-и функции туда пишется результат dlsym.
При повторном использовании он читается оттуда и никогда не изменяется.

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

ИМХО это говнокод.
Глобальную переменную нужно использовать в других целях. Обычно это что-то, что инициализируется явно 1-2 раза и не меняется, тем более по указателю.
Это не глобальные переменные - плохо. Это кто-то не умеет их использовать.
Статические ещё хуже т.к трудноразбираемо, вообще не принимаю
их как что-то позволительное.

mittorn ★★★★★
()

чот ЯННП. 5 страница, «А где царь?» (с)

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

ИМХО это говнокод.

полностью согласен. Проблема в том, что такой говнокод не сразу возникает: в начале проект простой, но он обрастает функциями, а функции юзают глобальные переменные. Этот ваш cal тоже наверное в 1989 не умел юлианский календарь, utf-8 и ncurses. А сейчас умеет. И строчек там было от силы 200, а сейчас 1000.

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

я же говорю: проблема в сопровождении кода.

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

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

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

юзает Clion

некоторые любят обмазываться говном, да.

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

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

можно сразу НЕ писать говнокод.

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

Любые упоминания PBKDF2 ты по прежнему игноришь.

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

Просто компилятор в сишке может выбирать любой путь из множества, причём сам по себе

Вылезай из манямирка. Компилятор выбирает тот путь, что описан в стандарте и на классическом x++ + ++x варнинги уже несколько лет как идут. Другое дело, что прогромизды эти варнинги не читают или не понимают (как и вообще все, что пишут).

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

если разработчиков больше одного лучше вообще не пользоваться С

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

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

ты безнадёжен.

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

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

очень неплохо борются с очевидным UB

Существует -fsanitize=undefined, который я впрочем не проверял никогда.

race conditions

valgrind --tool=helgrind

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