Почему я получаю предупреждение "заявление без эффекта"? - PullRequest
0 голосов
/ 24 октября 2010

Вот мой код

/* Initialise default without options input. */
options -> processHiddens = false;
options -> timeResolution = DEFAULT_MOD_TIMES;
options -> performSync = true;
options -> recursive = false;
options -> print = false;
options -> updateStatus = true;
options -> verbose = false;
options -> programname = malloc(BUFSIZ);
options -> programname = argv[0];

while ((opt = getopt(argc, argv, OPTLIST)) != -1)
{
    switch (opt)
    {
        case 'a':
            !(options -> processHiddens);
        case 'm':
            options -> timeResolution = atoi(optarg);
        case 'n':
            !(options -> performSync);
        case 'p':
            !(options -> print);
        case 'r':
            !(options -> recursive);
        case 'u':
            !(options -> updateStatus);
        case 'v':
            !(options -> verbose);
        default:
            argc = -1;
    }
}

То, что я пытаюсь сделать, - это перебрасывать логическое выражение каждый раз, когда вводится опция, следовательно, делать что-то вроде

!(options -> processHiddens);

вместо

options -> processHiddens = true;

Однако при компиляции я получаю следующее предупреждение:

mysync.c: In function ‘main’:
mysync.c:32: warning: statement with no effect
mysync.c:36: warning: statement with no effect
mysync.c:38: warning: statement with no effect
mysync.c:40: warning: statement with no effect
mysync.c:42: warning: statement with no effect
mysync.c:44: warning: statement with no effect

Ответы [ 4 ]

12 голосов
/ 24 октября 2010

Потому что !(options -> processHiddens) - это выражение, и вы никому не присваиваете результат. Вам нужно что-то вроде:

options->processHiddens = !options->processHiddens;
5 голосов
/ 24 октября 2010

Потому что !(options -> processHiddens); "совпадает с" 40 + 2. Это действительно не имеет никакого эффекта: -)

printf("foo");
40 + 2;
printf("bar");

хочешь

option -> processHiddens = !(options -> processHiddens);
break;        /* without break, all the following lines will execute */
1 голос
/ 24 октября 2010

Ваш код:

!(options -> processHiddens);

сбрасывает переключенное значение, следовательно вы получаете предупреждение.Вам необходимо скопировать переключенное значение обратно в переменную:

options -> processHiddens = ! options -> processHiddens;
0 голосов
/ 24 октября 2010

Что касается предыдущего ответа, я не думаю, что options -> updateStatus - это функция, потому что в противном случае компилятор будет жаловаться на ошибку.

Что касается переключения состояния, !(options -> updateStatus) - это просто тест (такговорить), чтобы определить, является ли options -> updateStatus true или false.

Что вам нужно это: options->updateStatus = !options->updateStatus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...