Это ошибка, потому что передача аргумента const char*
в функцию, которая принимает параметр char*
, нарушает правильность const;это позволило бы вам изменить объект const
, который бы победил всю цель const
.
Например, эта программа на C:
#include <stdio.h>
void func(char *s) {
puts(s);
s[0] = 'J';
}
int main(void) {
const char message[] = "Hello";
func(message);
puts(message);
return 0;
}
производит следующую командуДиагностика времени из gcc:
c.c: In function ‘main’:
c.c:10:5: warning: passing argument 1 of ‘func’ discards qualifiers from pointer target type
c.c:3:6: note: expected ‘char *’ but argument is of type ‘const char *’
Последнее сообщение помечено как «примечание», потому что оно относится к (совершенно законному) объявлению func()
, объясняя, что это объявление параметра, к которому относится предупреждение.
Что касается стандарта C, то это нарушение ограничения, что означает, что компилятор может обработать его как фатальную ошибку.По умолчанию gcc просто предупреждает об этом и выполняет неявное преобразование из const char*
в char*
.
Когда я запускаю программу, вывод:
Hello
Jello
, который показываетчто, хотя я объявил message
как const
, функция смогла его изменить.
Поскольку gcc не рассматривал это как фатальную ошибку, нет необходимости подавлять ни одно из диагностических сообщений,Вполне возможно, что код все равно будет работать (скажем, если функция ничего не изменит).Но предупреждения существуют по причине, и вы или сопровождающие лица симулятора архитектуры M-SIM, вероятно, должны взглянуть на это.
(Передача строкового литерала в func()
не вызовет эту диагностику, посколькуC не обрабатывает строковые литералы как const
. (Это делает поведение попытки изменить строковый литерал неопределенным.) Это по историческим причинам. У gcc есть опция, -Wwrite-strings
, которая заставляет его обрабатывать строкулитералы как const
, это на самом деле нарушает стандарт C, но это может быть полезной проверкой.)
Как я упоминал в комментарии, было бы полезно, если бы вы показали нам код, который запускаетдиагностика.
Я даже сам скачал и собрал симулятор архитектуры M-SIM, но я не увидел этого конкретного сообщения.