Мне известно, что в C вы не можете неявно преобразовать, например, char**
в const char**
(cf C-Faq, SO вопрос 1, ВОПРОС 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?
-
Объявить foo как взятие
char**
и просто документировать факт, что он не изменит свои входы? Это кажется немного грубым, особенно. так как он наказывает пользователей, у которых может бытьconst char**
, которые они хотят передать ему (теперь им нужно указать прочь const-ness) -
Заставляет пользователей вводить свой ввод, добавляя константу.
-
Что-то еще?