#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*
передаваемого в функцию cakingconst x*
. Если вы получаете сообщение об ошибке, это может быть что-то другое, у вас есть пример?3. @carl.hiass: Приведение из
const
в неconst
обязательно должно выдавать предупреждение, так что, вероятно, это то, о чем вы думаете. Надеюсь, понятно, почему с одним все в порядке, а с другим нет: решение не изменять то, что можно изменить, — это нормально. Попытка изменить что-то, что не должно быть изменено, — это плохо.