Intereting Posts

Как устранить предупреждение для передачи многомерного массива как многомерного массива const?

учитывая следующий код:

/* signatures */ int getParams(char params[MAX_PARAM_LEN][MAX_LINE_LEN]); int getVersion(const char params[MAX_PARAM_LEN][MAX_LINE_LEN], const char* tagName ); /* initializing */ char params[MAX_PARAM_LEN][MAX_LINE_LEN] = {}; /* getting parameters */ paramCount = getParams(params); /* OK, params match with getParams signature */ /* processing the params array */ i = getVersion(params, "version"); /* warning: passing arg 1 of `getVersion' from incompatible pointer type */ 

Я вижу, что это проблема, но я не знаю, почему и как ее избежать. То, что я хочу, – это функция, которая больше не может изменять params . Любые советы приветствуются (помимо отключения этого предупреждения или удаления константы в функции обработки).

Спасибо: Виско

Вы не можете устранить эти предупреждения в C, не делая явное приведение к правильному типу. Без typedef это будет выглядеть уродливым, хотя

 i = getVersion((const char (*)[MAX_LINE_LEN]) params, "version") 

Это странная причуда, характерная для языка C. В C ++ эта проблема была исправлена.

BTW, {} инициализатор является незаконным в C. Как вам удалось получить это для компиляции?

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

 int getVersion(/* const */ char params[MAX_PARAM_LEN][MAX_LINE_LEN], const char* tagName ); 
 foo((char const (*)[MAX_LINE_LEN] params); 

работает, но не очень практично и может быть опасным (он принимает любой указатель).

Более надежным способом было бы:

 foo((char const(*)[MAX_LINE_LEN])(char const*const){ &params[0][0] }); 

Вы можете автоматизировать эту «отливку» с помощью макроса P99_ACALL, см. http://gustedt.wordpress.com/2011/02/12/const-and-arrays/ для получения более подробной информации.