Edit:
Приведение является единственным подходом, если вы хотите отключить компилятор для каждого экземпляра переносимым способом. Это хорошо, если вы знаете, что делаете, например, что вы можете гарантировать, что результат atoi
никогда не будет отрицательным.
В GCC вы можете отключить все предупреждения о преобразовании знаков с помощью флага -Wno-sign-conversion
. Существует также -Wno-sign-compare
(для таких вещей, как 2u > 1
), но это не будет актуально, если вы не используете -Wextra
.
Вы также можете использовать диагностические прагмы как
#pragma GCC diagnostic ignored "-Wsign-conversion"
В MSVC есть несколько предупреждений, относящихся к несоответствию со знаком / без знака, например ::
- Уровень 4:
- Уровень 3:
- Уровень 2:
- C4267 (
size_t
& rarr; int
)
Чтобы отключить предупреждение в MSVC, вы можете добавить #pragma warning
например,
#pragma warning (disable : 4267)
или добавьте флаг /wd4267
в опциях компилятора.
Возможно, вам следует использовать strtoul
вместо atoi
.
size_t a = strtoul(val, NULL, 0);
(Нет предупреждения , только если size_t
равен unsigned long
. На большинстве платформ это правда, но это не гарантируется.)
Преимущество в том, что вы можете выполнять проверку ошибок с помощью этой функции, например,
#include <stdlib.h>
#include <stdio.h>
int main () {
char val[256];
fgets(val, 256, stdin);
char* endptr;
size_t a = strtoul(val, &endptr, 0);
if (val == endptr) {
printf("Not a number\n");
} else {
printf("The value is %zu\n", a);
}
return 0;
}