将 const char* 转换为 char* 时如何处理 -Wcast-qual

问题描述 投票:0回答:1

我想为我的库复制一个类似于

strtod
strtol
的函数(针对 C99 及更高版本)。
const char* str
是输入字符串,
char** end_str
返回指向第一个无效字符的指针。

// Wanting to replicate these functions
double strtod(const char* str, char** end_str);
long strtol(const char* str, char** end_str, int base);

int stringTo_int(const char* str, char** end_str) {
    int num = 0;
    while (*str >= '0' && *str <= '9') {
        num *= 10;
        num += *str - '0';
        str++;
    }
    if (end_str != NULL) { *end_str = str; } // -Wdiscarded-qualifiers
    if (end_str != NULL) { *end_str = (char*)str; } // -Wcast-qual
    return num;
}

但是,

*end_str = (char*)str
会发出
-Wcast-qual
警告,因为它正在删除
const
。我在 gcc 和 clang 的 C99 和 C23 中都收到此警告 (
-Wall -Wextra -Wpedantic -Wcast-qual
)。一种修复方法是将
end_str
更改为
const char** end_str
,但这也会迫使返回值变为
const

int stringTo_int(const char* str, const char** end_str);
int main(void) {
    char* text = "123abc";
    char* text_end = NULL;
    // warning/error from &text_end not being const char*
    int result = stringTo_int(text, &text_end);
    return 0;
}

可以通过使用编译指示来抑制 gcc 和 clang 中的警告,但这可能不适用于每个编译器。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
    if (end_str != NULL) { *end_str = (char*)str; }
#pragma GCC diagnostic pop

处理

-Wcast-qual
警告的正确方法是什么?

c casting qualifiers
1个回答
0
投票

我认为您不应该复制它们,因为它们不

const
正确。

但是如果你想完全按照原样复制它们,你可以使用

memcpy
而不是赋值,

int stringTo_int(const char* str, const char** end_str) {
    int num = 0;
    while (*str >= '0' && *str <= '9') {
        num *= 10;
        num += *str - '0';
        str++;
    }

    if (end_str != NULL) 
    { 
        memcpy(end_str, &str, sizeof(end_str)); 
    }
    return num;
}
© www.soinside.com 2019 - 2024. All rights reserved.