Это хорошая идея использовать константный указатель на тип FILE?

Как правило, ввод-вывод файла C выполняется с использованием FILE* как это то, что все стандартные функции библиотеки принимают.

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

Я задавался вопросом, может ли это быть применено к FILE*Итак, написал эту небольшую программу для проверки этого:

#include <stdio.h>


int main(void) {
    FILE* const file = fopen("somefile.txt", "w");
    if (file != NULL) {
        fprintf(file, "%s\n", "So this works? That's just swell!");
    }
    return 0;
}

Это прекрасно компилируется и работает так, как задумано, в Ubuntu/Linux 16.04 с использованием GCC (файл содержит именно ту строку, которую я ожидал), но я не уверен, что эта идиома такая хорошая идея - FILE Тип непрозрачен по дизайну, а обработка зависит от конкретной реализации.

Потому что нет никакой гарантии, что любая реализация библиотеки C не будет пытаться изменить адрес FILE Указатель, безопаснее не использовать этот подход при выполнении ввода-вывода в C?

1 ответ

Решение

Преобразование комментариев в ответ по запросу.

Ты можешь использовать FILE * const здраво; вы не можете использовать const FILE * здраво. Существует гарантия, что ни одна из функций в библиотеке C не изменит указатель части FILE * вы передаете им любым способом, который обнаруживается вызывающим кодом, потому что указатель всегда передается по значению, а не по адресу указателя. Таким образом, вызывающий код не может модифицировать ваш указатель - если только он не идет на безумно сложные шаги, чтобы сделать это, и не будет, потому что в этом нет никакой необходимости и никакой выгоды.

Я осознаю разницу между FILE * const а также const FILE * (а также почему последнее не имеет никакого смысла). В моем вопросе я пытаюсь уточнить, окажет ли создание указателя const какое-либо негативное влияние на стандартные библиотечные функции, так как они не используют указатели const в своих прототипах.

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

Это не может иметь никакого влияния на функции в библиотеке; им передают копию значения, и они не будут изменять значение, но не будут знать, что исходное значение в любом случае является неизменяемым, и им все равно. С помощью FILE * const fp = fopen(…); просто означает, что вы не можете повторно использовать этот указатель файла для чего-либо еще в той же функции (или повторите попытку открытия другого имени файла или вызова другой "открытой" функции), и вы не можете сбросить его на NULL после того, как вы fclose() Это. Конечно, если указатель выходит из области видимости, потому что он находится внутри цикла, его можно использовать повторно при повторном вводе области.

В противном случае, используя FILE * const не имеет никакого эффекта Я не думаю, что это полезно. Это не вредно, за исключением того, что оно не приносит никакой пользы (и может запутать людей). Я рекомендую против использования FILE * const,

Другие вопросы по тегам