Как устранить предупреждение для передачи многомерного массива как const многомерного массива? - PullRequest
2 голосов
/ 21 июня 2010

с учетом следующего кода:

/* 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. Любой совет приветствуется (кроме отключения этого предупреждения или удаления const в функции обработки).

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

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

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

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

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

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

1 голос
/ 21 июня 2010

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

int getVersion(/* const */ char params[MAX_PARAM_LEN][MAX_LINE_LEN],
               const char* tagName );
0 голосов
/ 11 января 2014
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/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...