我正在观察错误“警告C4090:'function':不同的'const'限定词”因为下面的代码行。通过其他类似的问题,我理解(不是100%)是因为
- > const char * EmployeeList []和我在EmployeeList的qsort中的声明
#define Elements(array) (sizeof(array)/sizeof((array)[0]))
const char *EmployeeList[] =
{
"Larry Page", "Sergy Brin", "Sundar Pichai", "Merrisa Mayer"
};
// called from main
SortEmployee(EmployeeList, Elements(EmployeeList));
int Compare(const void *elemA, const void *elemB)
{
...
}
void SortEmployee(const char *EmployeeList[], size_t EmployeeCount)
{
qsort(EmployeeList, EmployeeCount, sizeof(EmployeeList[0]), Compare);
}
但是我无法解决它 - 任何指针如何为字符串数组做。
答案 0 :(得分:5)
问题是qsort
没有将其参数声明为const
,而您的代码确实。这意味着qsort
可能(理论上)改变数据,由EmployeeList
指出。因此,编译器报告此错误。
以下是官方示例:https://msdn.microsoft.com/en-us/library/k77bkb8d.aspx
但是,这是一个简单的版本来展示我的想法:
void foo(char* a) {
*a = '1'; // I got pointer to char, and changed this char!
}
int main() {
const char *a = "A"; // I have "CONSTANT POINTER": it points to CONSTANT memory, that CAN NOT be changed (by the way, string constants can't in many environments).
foo(a); // I pass it to my function, that will change it.
return 0;
}
图像编译器将a
存储在只读存储器中(可以,因为我们告诉它"这是指向READ ONLY数据的指针")。然后修改它(在main
函数中)。可能发生了一件坏事。所以,编译器警告你"嘿,你将指向常量数据的指针传递给某个函数,不知道这个数据是不变的可以改变它"