Const при печати изменяемого объекта

#c

#c

Вопрос:

Необходимо ли объявлять изменяемый объект const , если функция его не изменяет, или это избыточность, которая не требуется? Например:

 #include<stdio.h>

void print_num_ptr(const int *n) {
    printf("Example print: %d", *n);
}
int main(void) {
    int i=4;
    int *ptr_i=amp;i;
    print_num_ptr((const int*)ptr_i);
    (*ptr_i)   ;
    print_num_ptr((const int*)ptr_i);

}
 

Против.

 #include<stdio.h>

void print_num_ptr(int *n) {
    printf("Example print: %d", *n);
}
int main(void) {
    int i=4;
    int *ptr_i=amp;i;
    print_num_ptr(ptr_i);
    (*ptr_i)   ;
    print_num_ptr(ptr_i);
}
 

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

Комментарии:

1. Это одно лишнее слово, а не «большая головная боль»…

Ответ №1:

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

Любая функция с не- const аргументом подразумевает, что она может или будет изменять это значение, которое, если не true, неправильно передает ваши намерения.

Добавление const ко всему может показаться бесполезным ритуалом, но у него есть очень важная функция.

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

Комментарии:

1. возможно, у меня есть некоторые предупреждения компилятора (с использованием GCC), но обычно при передаче изменяемого объекта функции, которая принимает его, поскольку const он часто выдает предупреждение. Когда он / не выдает предупреждения для приведения к const ? (Или, может быть, это когда он преобразуется из const в неконстантный, где он выдает предупреждения?)

2. Приведение к const должно происходить неявно для данного x* передаваемого в функцию caking const x* . Если вы получаете сообщение об ошибке, это может быть что-то другое, у вас есть пример?

3. @carl.hiass: Приведение из const в не const обязательно должно выдавать предупреждение, так что, вероятно, это то, о чем вы думаете. Надеюсь, понятно, почему с одним все в порядке, а с другим нет: решение не изменять то, что можно изменить, — это нормально. Попытка изменить что-то, что не должно быть изменено, — это плохо.