警告C4090:'function':不同的'const'限定符

时间:2015-08-12 19:31:19

标签: c pointers

我正在观察错误“警告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);
}

但是我无法解决它 - 任何指针如何为字符串数组做。

1 个答案:

答案 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函数中)。可能发生了一件坏事。所以,编译器警告你"嘿,你将指向常量数据的指针传递给某个函数,不知道这个数据是不变的可以改变它"