Ошибка компиляции c ++ 'ожидается'; ' в конце объявления 'при использовании прямой инициализации скобок - PullRequest
5 голосов
/ 20 июня 2020

Я новичок в C ++, прорабатываю свой первый учебник, и когда я пытаюсь скомпилировать код из урока, я получаю следующую ошибку:

expected ';' at end of declaration
    int x{ }; // define variable x to hold user input (a...
         ^
         ;

Полный код программы, которую я Я пытаюсь запустить:

#include <iostream>  // for std::cout and std::cin
 
int main()
{
    std::cout << "Enter a number: ";
    int x{ }; 
    std::cin >> x; 
    std::cout << "You entered " << x << '\n';
    return 0;
}

Я использую Visual Studio Code (v.1.46.1) на Macbook Pro с расширением Microsoft C / C ++ (https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools ).

Мой компилятор - Clang:

Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Первоначально я запустил Terminal> Configure Default Build Task в VS Code, чтобы создать файл настроек компилятора .vscode / tasks. json. Этот файл в настоящее время выглядит так:

{
    "version": "2.0.0",
    "tasks": [
    {
      "type": "shell",
      "label": "C/C++: clang++ build active file",
      "command": "/usr/bin/clang++",
      "args": [
        // Set C++ Standards 
        "-std=c++17",

        // Increase compiler warnings to maximum
        "-Wall",
        "-Weffc++",
        "-Wextra",
        "-Wsign-conversion",

        // Treat all warnings as errors
        "-Werror",

        // Disable compiler extensions
        "-pedantic-errors",

        // File to compile
        "-g",
        "${file}",

        // Output file
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${workspaceFolder}"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

У меня установлен флаг -std=c++17, который должен разрешить прямую инициализацию скобок, насколько я понимаю.

Я не уверен, что это важно, так как я пытаюсь компилировать, а не собирать / отлаживать, но для тщательности у меня также есть файл .vscode / launch. json со следующим содержимым:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "clang++ - Build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "lldb",
      "preLaunchTask": "C/C++: clang++ build active file"
    }
  ]
}

Может кто-нибудь поможет Я выясню, почему int x{ }; не работает должным образом, чтобы инициализировать переменную, и что я могу сделать, чтобы исправить это, чтобы она работала?

[Изменить]: Дополнительные настройки, которые я проверил / протестировал:

  • Код компилируется правильно при запуске компиляции непосредственно из командной строки с clang++ -std=c++17 -g helloworld.cpp -o helloworld
  • VS Code C / Конфигурация расширения C / C ++ имеет параметр «Стандарт C ++», установленный на C ++ 17 (похоже, дефолт). Даже в этом случае выполнение компиляции из командной строки без установленного флага -std=c++17 вызывает ту же ошибку компилятора.
  • Попытка изменить int x{ }; на следующее:
    • int x( );: сбой с очень длинным списком ошибок
    • int x(0);: успешно компилируется
    • int x = { };: успешно компилируется
    • int x = {0};: успешно компилируется
    • `int x; ': успешно компилируется
    • `int x = 0; ': успешно компилируется

1 Ответ

0 голосов
/ 21 июня 2020

Ссылаясь на это объяснение инициализации списка , этот синтаксис должен быть законным, так как c ++ 11:

int main()
{
    int n0{};     // value-initialization (to zero)
    int n1{1};    // direct-list-initialization
    //...
}

Я попытался скомпилировать ваш код в своей локальной среде, и все сработало нормально:

clang++ -std=c++17 -Wall -Weffc++ -Wextra -Wsign-conversion -Werror -pedantic-errors ...

clang++ --version
clang version 9.0.1 
Target: x86_64-pc-linux-gnu
Thread model: posix

Возможно, вы использовали что-то подобное ';' символ, который не является ASCII? Я попытался использовать вместо этого китайский символ ';' и получил следующее:

fly.cc:32:13: error: treating Unicode character <U+FF1B> as identifier character rather than as ';' symbol [-Werror,-Wunicode-homoglyph]
    int x{ }; 
            ^~
fly.cc:32:13: error: expected ';' at end of declaration
    int x{ }; 
            ^
            ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...