Описание проблемы
У меня есть функция, которая получает константный указатель на константный двойной массив, в котором я зацикливаюсь, используя размер в качестве проверки границы внутри my_func.
Декларация в .ч
void my_func(const double * const my_array, size_t size);
Реализация в .c
void my_func(const double * const my_array, size_t size) {
for (size_t idx = 0; idx < size; idx++) {
do_something_with(my_array[idx]);
}
}
Я не хочу, чтобы указатель был изменен внутри функции, следовательно, делая его * const
. Я не хочу, чтобы данные, на которые он указывает, были изменены, поэтому const double
.
Clang-Tidy, однако, хочет, чтобы у меня была функция объявление отбрасывает константу на указателе, делая ее
void my_func(const double * my_array, size_t size);
Clang-Tidy: параметр 'my_array' является const-квалифицированным в объявлении функции; const-квалификация параметров влияет только на определения функций
Если я следую этому совету, но хочу сохранить свои ограничения сверху, мои объявление функции и определение больше не совпадают.
Вопросы
1)
Предположим, что мой аргумент-указатель не является константой (const double * pointer_arg
), если я изменю pointer_arg
внутри функции, чтобы она указала на другой const double
, будет ли изменение видимо за пределами моей функции? То есть, после строки, в которой я выполнил свою функцию, где заполнение указывает pointer_arg
? Если он не виден, означает ли это, что указатель копируется по значению? Это вообще возможно?
2)
Какова причина решения, которое const в декларации не имеет никакого эффекта?
3)
В чем может быть преимущество наличия другой подписи функции в объявлении и определении? Для меня, глядя на мой заголовочный файл, не ясно, как работает реализация, будет ли она const внутри функции, не так ли? Это вызывает путаницу у меня или соавтора над кодом.
4)
Должен ли я опустить const в декларации? Каковы лучшие практики в этом случае?