【问题标题】:warning C4090: 'function' : different 'const' qualifiers警告 C4090:“功能”:不同的“常量”限定符
【发布时间】:2015-08-12 19:31:18
【问题描述】:

由于下面的代码行,我观察到错误“警告 C4090: 'function' : different 'const' qualifiers”。我了解(不是 100%)关于 SO 的其他类似问题是因为

--> 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);
}

但是我无法解决它-任何指针如何为字符串数组执行此操作。

【问题讨论】:

  • 我感觉问题出在Compare 函数上,而不是EmployeeList 数组上。发布Minimal Complete Verifiable Example 会让这个问题更容易回答。
  • 我已经修改了代码部分并放置了更多相关的代码部分。如果它还不够 - 将放置整个代码 - 只是试图避免集群。
  • 我认为该代码没有问题,Compare 函数看起来是正确的。我填空制作了一个 MCVE,它编译时没有错误或警告(使用带有 -Wall 的 clang),并且运行良好。你用的是哪个编译器?
  • 我正在使用微软编译器

标签: c pointers


【解决方案1】:

问题是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 存储在只读内存中的图像(它可以,因为我们告诉它“这是一个指向只读数据的指针”)。然后修改它(在main 函数中)。可能会发生一些不好的事情。因此,编译器会警告您“嘿,您将一个指向 constant 数据的指针传递给某个函数,而 不知道该数据是常量并且 可能 em> 改变它”

【讨论】:

  • 当然它会改变EmployeeList指向的数据:它应该是它应该排序的指针。 const 仅适用于下一级取消引用。
  • @user996142 - 感谢您的详细回答。我确实理解这一点,我试图在我的问题中指出这个问题——我想知道有没有办法克服它——假设我不能改变 const char *EmployeeList[] = { "Larry Page", "Sergy Brin", " Sundar Pichai", "Merrisa Mayer" };
  • 我刚刚将 void SortEmployee(const char *EmployeeList[], size_t EmployeeCount) 更改为 void SortEmployee(char *EmployeeList[], size_t EmployeeCount) 我不再看到它 - 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多