避免 GCC 编译器“不兼容的指针类型”警告

Avoiding GCC compiler "incompatible pointer type" warnings

提问人:Fyodor 提问时间:11/13/2023 更新时间:11/14/2023 访问量:51

问:

我写了两个函数。一个用于复制以下类型的数组:char

void char_arr_copy(const char *src, char *dst, int arr_size)
{
    int i;
    for (i=arr_size-1; i >= 0; src++, dst++, i--)
        *dst = *src;
}

另一个用于复制地址数组:char

void word_arr_copy(const char **src, char **dst, int arr_size)
{
    int i;
    for (i=arr_size-1; i >= 0; src++, dst++, i--)
        *dst = *src;
}

我认为这是一件重要的事情,可以在函数标头中向未来的程序读取器显示该函数不会更改它操作的某些地址的内容。

虽然第一个函数编译良好,但编译第二个函数会导致以下警告:

revert_str_input_arr2.c:30:14: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
   30 |         *dst = *src;
      |              ^
revert_str_input_arr2.c: In function ‘create_new_word’:
revert_str_input_arr2.c:44:23: warning: passing argument 1 of ‘word_arr_copy’ from incompatible pointer type [-Wincompatible-pointer-types]
   44 |         word_arr_copy(*word_arr_ptr, tmp, word_arr_size-1);
      |                       ^~~~~~~~~~~~~
      |                       |
      |                       word {aka char **}
revert_str_input_arr2.c:26:33: note: expected ‘const char **’ but argument is of type ‘word’ {aka ‘char **’}
   26 | void word_arr_copy(const char **src, char **dst, int arr_size)
      |                    ~~~~~~~~~~~~~^~~

据我了解,人们不能等同起来,这就是我所有警告的来源。很遗憾,因为我可以在我的第一个函数中使用 和 做完全相同的事情。const addressaddressconst charchar

因此,解决此问题的唯一方法是省略标识符,对吗?const

所以事实证明,我可以向(潜在的未来程序读者)表明我不会只在我的一个功能中更改内容,而在另一个功能中我不能以任何方式这样做?src

数组 C 指针 常量

评论

1赞 Some programmer dude 11/13/2023
请尝试。这将是指向常量字符串的指针的“数组”(本质上)。char* const* src

答:

1赞 Toby Speight 11/14/2023 #1

你的意思可能是

void word_arr_copy(const char *const *src, const char **dst, int arr_size)

void word_arr_copy(char *const *src, char **dst, int arr_size)

(取决于元素是分别指向常量字符还是可变字符)。


顺便说一句,我会先推荐写作,所以它看起来像标准函数,例如(它本身通过类比运算符将目的地放在第一位)。这将有助于减少用户混淆。并首选 size 参数。dstmemcpy()=size_t

3赞 Lundin 11/14/2023 #2

const char **src这里的“常量正确性”位于指向的(指向)项 a .如果您希望指针数组是 const 正确的,则:const char

void word_arr_copy (char*const* src, char** dst, int arr_size)

从右到左阅读这些内容:“指向只读指针的指针”。char

但是,请考虑以下改进:

void word_arr_copy (int arr_size, char* dst[arr_size], char*const src[arr_size])

评论

0赞 Lundin 11/14/2023
或者,如果我们不希望这些重叠,可以进行轻微的微优化:void word_arr_copy (int arr_size, char* dst [restrict arr_size], char*const src [restrict arr_size])