我想为我的库复制一个类似于
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
警告的正确方法是什么?
我认为您不应该复制它们,因为它们不
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;
}