Вопрос
У меня есть следующий код:
родовое словоОн нормально компилируется с "gcc -Wall -ansi -pedantic".Но с другим набором инструментов (Rowley) он жалуется на
родовое словов строке, где стоит char ** t.Это действительно незаконный код или все в порядке?
Спасибо за все ответы.Теперь я знаю, в чем была моя проблема.Однако возникает новый вопрос:
Решение
Мне кажется совершенно законным;char *[3]
распадается на char **
, поэтому присвоение должно быть действительным.
Ни GCC 4.4.5, ни CLang 1.1 не жалуются.
Другие советы
Хотя на практике array1
должен распадаться на указатель типа char **
, его реальный тип - это char *[3]
, отсюда и предупреждение.
Чтобы подавить предупреждение, вы можете попробовать явно применить его:
родовое слово array1 - это (char *)[3]
, который семантически отличается от char **
, хотя при присвоении он должен быть изящно деградирован до char **
Указатели и массивы и совместимы только в статической области.В глобальной области указатель и массив не совпадают, их смешивание приведет к неопределенному поведению.Так что, на мой взгляд, предупреждение верное.
Попробуйте поставить:
родовое словов одном модуле и:
родовое словов другом компилируйте и связывайте.(Я не пробовал ...) Я ожидал, что что-то пойдет не так ...