Почему при использовании функции goto мои функции дают мне «ожидаемое первичное выражение перед токеном»}? - PullRequest
0 голосов
/ 15 октября 2018

Моя функция выдает мне "ожидаемое первичное выражение до '}' токена" при использовании goto, и я не знаю почему.

Этот код работал как есть в основном, прежде чем я поместил его вфункция.

Это работает, когда я заменяю 'goto' на 'break', но мне нужно знать, почему это так.

void fileInputLoop(ifstream& inputFile){
    do{

        cout << "Enter data file name: ";
        getline(cin, fileName);
        previousFileName = fileName;
        // The user will press enter to exit data input 
        if(fileName == ""){
            // If no file name is entered, exit this input loop
            goto skip_data_input_loop;

        }else{
            // Check to see if input is an existing file
            inputFile.open(fileName);
            if(!inputFile.is_open()){
                cout << "File is not available." << endl;
            }else{
                // FILE IS OPEN, DO SOMETHING WITH IT
                ReadData(inputFile);
                inputFile.close();
            }
        }
        // If a second++ file is read in, the previous file will be set accordingly
        // This is to track if a duplicate is from the same file or a new file
        previousFileName = fileName;

    }while(true);
    skip_data_input_loop:
}

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Формат оператора goto ниже синтаксиса

goto label;
... .. ...
... .. ...
... .. ...
label: 
statement;
... .. ...

Как и в случае с main, вы бы имели оператор return ниже метки, и для этой функции сразу после метки в конце функции следуетконец} функции, которую они в соответствии с синтаксисом ожидают после метки оператора или выражения.

вы можете использовать оператор печати или пустой возврат

Пример:

    }while(true);
    skip_data_input_loop:
    return;
}
0 голосов
/ 15 октября 2018

Проблема в том, что метки должны обозначать оператор.Другими словами, вы не можете иметь метку без следующего утверждения.

С предостережением моего комментария вы можете решить эту проблему, добавив пустой «нулевой» оператор после метки:

skip_data_input_loop: /* Empty statement using the semicolon */ ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...