Я знаю, что в C вы не можете неявно преобразовать, например, char**
в const char**
(ср C-Faq , SO вопрос 1 , SO Вопрос 2 ).
С другой стороны, если я увижу функцию, объявленную так:
void foo(char** ppData);
Я должен предположить, что функция может изменять передаваемые данные.
Поэтому, если я пишу функцию, которая не изменяет данные, лучше, по моему мнению, объявить:
void foo(const char** ppData);
или даже:
void foo(const char * const * ppData);
Но это ставит пользователей функции в неловкое положение.
Они могут иметь:
int main(int argc, char** argv)
{
foo(argv); // Oh no, compiler error (or warning)
...
}
И чтобы аккуратно вызвать мою функцию, им нужно будет вставить приведение.
Я работаю в основном на C ++, где это менее проблематично из-за более глубоких константных правил C ++.
Что такое идиоматическое решение в C?
Объявить foo как char**
, и просто задокументировать тот факт, что он не изменит свои входные данные? Это кажется немного грубым, особенно так как он наказывает пользователей, у которых может быть const char**
, что они хотят передать его (теперь они должны отбросить прочь постоянство)
Заставить пользователей вводить свои данные, добавляя постоянство.
Что-то еще?