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

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

чем тебе такой вариант не мил?

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

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

Еще раз спрашиваю, ДА или НЕТ ? Да или НЕТ ?

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

Элементарно, Ватсон:

#include <stdio.h>

char *gvar;     // No need to null it, it's already nulled

void
func(char *s)
{
        char *path;

        asprintf(&path, "%s%s", s, " - continued string ");
        printf("String = %s\n", path);
        free(path);
}

int
main(int argc, char **argv)
{
        int my_condition = 0;   // или 0

        gvar = gvar ? "One String" : "Second String";

        if (my_condition)
                gvar = "Third String";  // просто пример, чтобы не раздувать код лишним

        func(gvar);

        return 0;
}
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от FreakMurderer

Еще раз спрашиваю, ДА или НЕТ ? Да или НЕТ ?

Чё ты кричишь? ;) Тут нет однозначного ответа, но если есть такая возможность — избавься от глобальных переменных. В твоём же «use-case» скорей всего «и так сойдёт».

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

я хочу увидеть как бы вы сделали, в файле 1899 line

файле 1899 line

И именно по этому globals избегают. Т.к. потом чёрт ногу сломит.

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

в файле 1899 lines

Если у тебя так дохрена строк в файле, то явно ты неправильно пишешь: надо разбить хотя бы на 5 файлов такую дурищу!

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

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

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

Один только я тебе уже три раза ответил — «не <beep> мозги» — в твоём случае, скорей всего, всё нормально. ... но можно бы было сделать лучше.

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

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

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

Кому это нужно? Нам или тебе? Ты спросил — тебе ответили. А ещё ругаешься. ;)

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

Конкурентная запись есть? Нет. Значение меняется во время исполнения? Нет. Один один раз пишит, другие много раз читают? Да. Ну и всё в порядке, за исключением поддрежки этой лапши. ;)

Hint: для глобальных раньше было «правило»: локальные короткие (e.g. s, p, t), глобальные длинные (e.g. mySuperPuperConfigVariable), препроцессор upper-case (e.g. MYOTHERCONFIGSETTING).

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

Этот наркоман еще и объявлял глобальные переменные как static, хотя у него весь бинарь из одного файла компилируется... Кошмар, что за тяжелые вещества он принимал?

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

Я уже говорил, очень много функций, много кода, очень много переписывать...

Ну вот видишь?

Еще раз спрашиваю, ДА или НЕТ ?

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

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

char *gvar; // No need to null it, it's already nulled

я не понял, зачем оно здесь, а не в main?

Ну и инициализация чем тебе помешала? Если таки перенесёшь в main, там будет мусор.

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

Пусть говорит Да или Нет...

яя тебе уже сколько раз говорил, что глобальные переменные не нужны?! Лучше всего их изначально не делать.

в файле 1899 lines ... Я серьезно, не шучу...

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

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

В принципе в global ничего такого плохого нет. Это ничем не хуже «one master struct». Если оно и в самом деле почти в каждой функции модуля используется — то это вполне приемлемое решение.

По поводу иницализации — don't do things double. ж) Глобоальные инициализировать не надо, локальные — надо.

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

и что ты там хочешь убрать?

static int excludes[256];
static size_t nexcludes;
static int includes[256];
static size_t nincludes;
static struct libmnt_table *mtab, *swaps;
static struct libmnt_cache *mntcache;
#ifdef HAVE_LIBUDEV
struct udev *udev;
#endif

говорил «одна»…

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

Кошмар, что за тяжелые вещества он принимал?

это RedHat, у них бывают заскоки.

Этот наркоман еще и объявлял глобальные переменные как static, хотя у него весь бинарь из одного файла компилируется...

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

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

В принципе в global ничего такого плохого нет.

см. выше.

По поводу иницализации — don't do things double. ж) Глобоальные инициализировать не надо, локальные — надо.

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

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

код просится на разделение кусками помельче

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

Кстати, я подобные финты встречал у матерых программистов, которые еще на заре возникновения сишечки на ней начали писать. Они любят делать "1 файл — 1 бинарь" и кучу глобальных переменных. А то и вообще одну-единственную main на полторы тыщщи строк...

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

Чувак, узбагойся. Это же ЛОР! Народ тут иногда полезные вещи говорит, как сейчас. И это один из адекватных тредов.

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

что бы скрыть доступ легко и непринужденно

От кого ты что скрывать собрался? Понапишут wrapper на adaptor'е, delegate'ом погоняет, а ты потом смотришь на это говно и думаешь: «Кто вообще этих людей к разработке подпустил?»

KISS. Если эти буквы тебе ни о чем не говорят, то, наверное, ты что-то делаешь неправильно.

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

ООП

goto применимо всегда (правда не все умеют, видиму потому и запрещают по дефолту), ООП - не всегда. Притягивание ООП «за уши» порицаю я.

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

ты топиком не ошибся? Мы про сишку.

А есть какие-то принципиальные проблемы с покрытием сишного кода юнит-тестами?

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

в файле 1899 lines

wc -l main.c
3734

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

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

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

А вот нате, блин... Давайте , поспорьте с Калифорнийским универом : Фиг , я послушаю теперь этого emulek-а, чучмека :))

One:

https://github.com/karelzak/util-linux/blob/master/misc-utils/cal.c#L79

Two:

https://github.com/karelzak/util-linux/blob/master/misc-utils/cal.c#L316

Этот пакет утилит уже много лет предустановлен на многих Линукс системах, считается в своем роде эталоном, описан в Википедии, признан сообществом, и ОМГ - там используются глобальные переменные.. Что же делать !!! Что же делать, ааа! :) LOL

Так же как и я делаю (как я показал в моем первом сообщении), может emulek просто еще не научился «готовить» глобальные переменные.. Избавился от бы поскорее, от своей какой то, больной, что ли категоричности...

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

Да кто ж тебе сказал, что «плохо»? Порой неудобно — да. Плохо? Скорее фанатизм. ;) (Так же, как и про goto.)

В общем, и global, и goto — порой полезны и уместны. Но если есть такая возможность, то лучше без. И весь сказ. Просто так меньше spagetti-code, который поддерживть — содом и гомора.

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

Да кто ж тебе сказал, что «плохо»?

(шепотом) тссс... мне сказал чувак, по имени emulek... только ни кому не рассказывайте :)

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

описан в Википедии, признан сообществом

libreadline, знаешь ли, тоже много кто пользуется и одобряет. Тем не менее, там с глобальными переменными переборщили, что делает весьма проблематичным использование readline для создания «умных» server-side автокомплитеров.

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

А есть какие-то принципиальные проблемы с покрытием сишного кода юнит-тестами?

конечно! UB по определению может пройти любое тестирование. ИЧСХ часто проходит IRL.

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

Из них около сотни - глобальные переменные. Очень удобно получилось. Еще раз говорю: не слушай местных экспертов, у которых каждая функция принимает по 20 аргументов, лишь бы не было глобальных переменных, потому что в книжках пишут, что это плохо.

насрать на книжки. Это плохо IRL.

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

UB по определению может пройти любое тестирование

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

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

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

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

One: Copyright (c) 1989, 1993, 1994

и как оно в прошлом веке? Давай ты это говно мамонта обратно закопаешь?

Этот пакет утилит уже много лет предустановлен на многих Линукс системах, считается в своем роде эталоном, описан в Википедии, признан сообществом, и ОМГ - там используются глобальные переменные.. Что же делать !!! Что же делать, ааа!

в таких хэлловорлдах вполне реально юзать глобальные переменные. Программа cal(1) довольно примитивная, меньше тысячи строк включая кучу комментариев. Работает. Что ещё надо?

Так же как и я делаю (как я показал в моем первом сообщении), может emulek просто еще не научился «готовить» глобальные переменные..

дурное дело нехитрое. Ты задал вопрос, я ответил и указал на причины, по которым я не люблю глобальные переменные. Для тех кто в танке повторюсь: слишком большая область видимости и время жизни — плохо. Но ты можешь дальше юзать, я не против.

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

Смешной примерчик нужности глобальных переменных у вас... Этот код с глобальными Senter, Sexit - остаток древнего говнокода, который забыли вычистить при рефакторинге, а has_term вообще добавлен в марте 2015, и сделан он в виде глобальной переменной только потому, что это - грязный хак, т.е. быстрое исправление бага, чтобы не париться с дорефакторингом.

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

мне сказал чувак, по имени emulek...

ты сам требовал ответ. Я ответил, и что? Ты только сильнее нервничаешь. Попей валерьянки. Тебе за глобальные переменные что-ли доплачивают?

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