В панели управления U1 существует опция установить U1 для не соединения автоматически. Возможно, это - то, в чем Вы нуждаетесь. Когда Вы войдете в систему, U1 не запустится, и необходимо запустить его вручную через панель управления.
Даже с приведением, сравнение остается верным во всех случаях определенного поведения. Компилятор по-прежнему определяет, что (signed int) 0
имеет значение 0, и по-прежнему определяет, что (signed int) x)
неотрицательно, если ваша программа определила поведение (приведение из unsigned to signed не определено, если значение выходит за пределы диапазона для подписанного типа).
Таким образом, компилятор продолжает выводить предупреждение, потому что он продолжает полностью исключать случай else.
Изменить : Чтобы отключить предупреждение, напишите ваш код как
#define VALUE 0
int test(unsigned char x) {
#if VALUE==0
return 1;
#else
return x>=VALUE;
#endif
}
x
- это беззнаковый символ
, что означает, что он находится между 0 и 256. Поскольку int
больше, чем char
, преобразование unsigned char
в signed int
по-прежнему сохраняет исходное значение char
. Поскольку это значение всегда> = 0, ваш if
всегда истинен.
Все значения unsigned char
могут идеально соответствовать вашему int
, поэтому даже с приведением вы никогда не получите отрицательное значение. Вам нужно преобразование в signed char
- однако в этом случае вы должны объявить x
как signed
в сигнатуре функции. Нет смысла лгать клиентам, что вам нужно беззнаковое значение, в то время как на самом деле вам нужно подписанное.
#define
of VALUE
to 0
означает, что ваша функция сводится к следующему:
int test(unsigned char x) {
if (x>=0)
return 0;
else
return 1;
}
Начиная с x
всегда передается как беззнаковый char
, тогда он всегда будет иметь значение от 0
до 255
включительно, независимо от того, приводите ли вы x
или 0
в подписанное int
в операторе if
. Поэтому компилятор предупреждает вас, что x
всегда будет больше или равно 0
, и что условие else
никогда не будет достигнуто.