这困扰我。它给了我一个警告
passing argument 1 of ‘funcName’ discards qualifiers from pointer target type
然而,程序运行得很好并打印提交的值。
功能如下
void funcName(char *str) {
printf("%s", str);
}
void main() {
funcName("Hello world");
}
输出是Hello world。
答案 0 :(得分:5)
因为"Hello, world"
是常量,所以将函数更改为
void funcName(const char *text)
{
printf("%s\n", text);
}
字符串文字是常量,它们存储在程序的只读存储器部分,传递没有const
的指针意味着你可以在目标函数内意外修改它,如果这样做,那将导致未定义的行为,编译器正试图保护您免受此攻击。
此外,void main()
不是main()
的标准合规有效签名,您可以在标准之前的旧书中找到它,但现在它已不再被接受,接受和标准签名
int main(void)
如果您不处理命令行参数。int main(int argc, char **argv)
处理argc
中存储在命令行中传递的argv
个参数。答案 1 :(得分:2)
似乎问题是这个C程序被编译为C ++程序。
在C ++中,字符串文字具有常量字符数组的类型。因此,如果在C ++程序中,您将字符串文字作为参数提供给具有相应参数但没有限定符const的函数,则编译器将发出消息。
如果要将程序编译为C程序,则代码有效,因为在C字符串文字中有非常量字符数组的类型,编译器不应发出相对于限定符的诊断消息。
然而,无论如何最好声明像
这样的函数void funcName( const char *str );
^^^^^^
因为在这种情况下,函数的用户可以确保传递给函数的字符串不会被更改。
考虑到没有参数的函数main应该在C中声明,如
int main( void )