Действительно ли это - обычная практика, чтобы снова использовать то же буферное название различных вещей в C?

Например, предположите, что мне назвали буфер char journal_name[25] который я использую для хранения названия журнала. Теперь предположите несколько строк позже в коде, я хочу сохранить чье-то имя в буфер. Если я иду char person_name[25] или просто снова используйте journal_name[25]?

Проблема состоит в том, что все, кто читает код (и меня также после нескольких недель) должны понять journal_name теперь на самом деле person_name.

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

Что Вы думаете об этой проблеме?

Спасибо, Boda Cydo.

11
задан bodacydo 15 August 2010 в 20:32
поделиться

7 ответов

Здесь действительно есть код. Однако следует отметить пару моментов:

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

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

8
ответ дан 3 December 2019 в 01:51
поделиться

Используйте имя_персонала [25] . Никто не любит трудночитаемый код. Это ничего не сделает для вашей программы с точки зрения памяти. Пожалуйста, сделайте это так, чтобы это было удобно для чтения.

2
ответ дан 3 December 2019 в 01:51
поделиться

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

25 символов (если это не только пример) не «сломают банк», но если память ограничена, вы можете динамически выделить хранилище для journal_name , а затем освободить его, когда вы закончили с ним перед динамическим выделением памяти для person_name . Хотя есть «накладные расходы» на указатель на массив.

Другой способ - использовать локальную область видимости для массивов:

void myMethod()
{
    ... some code
    {
        char journal_name[25];
        ... some more code
    }
    ... even more code
    {
        char person_name[25];
        ... yet more code
    }
}

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

2
ответ дан 3 December 2019 в 01:51
поделиться

Если вас беспокоит память, и я сомневаюсь, что 25 байтов будут проблемой, но тогда вы можете просто использовать malloc и free , и тогда у вас просто будет еще 4- Для указателя используется 8 байтов.

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

ОБНОВЛЕНИЕ:

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

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

1
ответ дан 3 December 2019 в 01:51
поделиться

Как альтернатива предыдущим (хорошим) ответам, что насчет

char buffer[25];

char* journal_name = buffer;

потом позже

char* person_name = buffer;

Будет ли это нормально?

4
ответ дан 3 December 2019 в 01:51
поделиться

Если оба буфера автоматические, почему бы не использовать это? Большинство компиляторов справятся с этим правильно при повторном использовании памяти. Но вы сохраняете читабельность.

{
    char journal_name[25];
    /*
        Your code which uses journal_name..
    */
}
{
    char person_name[25];
    /*
        Your code which uses person_name...
    */
}

Между прочим, даже если ваш компилятор тупой и у вас очень мало памяти, вы можете использовать union, но для удобства чтения оставьте разные имена. Наихудший вариант - использование одной и той же переменной.

3
ответ дан 3 December 2019 в 01:51
поделиться

Если вы действительно не хотите тратить память, если вы действительно не хотите тратить память, способ решить эту проблему:

int main()
{
  {
    char journal_name[26];
    // use journal name
  }
  {
    char person_name[26];
    // use person name 
  }
}

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

В качестве альтернативы назовите его name и используйте его для обоих <. <

16
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: