VSCode ignores cpp standard when folder is opened in WSL: Ubuntu? - c++

When I open a folder with WSL: Ubuntu and then try to build the project it seems to ignore the cpp standard set in VSCode's User settings. I can choose the standard I want by configuring a task.json file however I want to know how to change the default cpp standard for any folder opened in VSCode with WSL: Ubuntu. I have tried adding the following in my User settings in VSCode.
...
"C_Cpp.default.cppStandard": "c++17",
...
"code-runner.executorMap": {
...
"cpp": "cd $dir && g++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
...
},
And yet when I build the following and execute the output I get 201402 indicating it is using c++14.
#include <iostream>
int main()
{
std::cout << __cplusplus << std::endl;
return 0;
}
Any suggestions on how to change the default c++ standard?
It seems that if I open the file in windows then it works fine as well so I don't know what the difference is here?

Related

Compiling a cpp file with vscode, in Ubuntu

I'm trying to follow this link on how to get started with c++ and vscode in ubuntu.
I have gcc already installed with the latest version.
Running sudo apt-get install build-essential gdb gives:
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version (12.8ubuntu1.1).
build-essential set to manually installed.
gdb is already the newest version (9.2-0ubuntu1~20.04.1).
gdb set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
However, when I get to the stage of creating the config file, I have no option for C/C++: g++ build active file. I only have
So, I choose /usr/bin/cpp.Then I build the file, and get the success message.
However, when run the newly created executable file, I get several error messages:
./helloworld: line 17: namespace: command not found
./helloworld: line 23: syntax error near unexpected token `('
./helloworld: line 23: ` typedef decltype(nullptr) nullptr_t;'
the strange thing is that the lines with code in the helloworld file end on line 16, so I think there's something wrong with the compiler...
Its best to get GCC working in your commandline, then get it working using VS Code tasks.
I suggest that you create the most simplistic project structure you can. Use only a project directory, and a single file named main.cpp.
Something that looks like this:
PROJECT (dir) // path = ./
│
└──> main.cpp (file) // path = ./main.cpp
Once you have a directory with main.cpp do 1 of 2 things:
Use the following command to add a Hello World example to your main.cpp file.
$> echo -e "\n#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n cout << \"Hello World\!\" << endl;\n}" > main.cpp
Or copy and paste the code below into main.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
}
FYI: You should be doing this from the command-line not vscode (not until you create the vscode task which I will show bellow)
Another thing to note, is your commandline should be pointed to your project directory, the directory you created with main.cpp in it.
From inside your project directory execute the following command.
$> g++ ./main.cpp -o build
if your file compiled & built your executable correctly you should be able to use the ls command to see a new file named build in your project directory.
If all went well, the new build file is an executable. Execute it by entering...
$> ./build
and you should see "Hello World!"
At this point use the following command...
$> code .
VS Code should open to your projects directory.
Now using vscode create another directory, and name it ./.vscode
Then add a file to the ./.vscode directory named tasks.json
The files full pathname will be: ./.vscode/tasks.json
then you will want to add the following to your tasks file
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "GCC: My Compilation Task",
"command": "/usr/bin/g++",
"args": ["-g", "./main.cpp", "-o", "./build"],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
then you should be able to press F1 and type RUN TASK, when you see the option in the quick menu that says RUN TASK click it, and then select the tasks with the same name as the label key in your tasks.json file, which is "GCC: My Compilation Task"

Run C and C++ on VS Code (and even a little problem with vs code bars)

i have some problems:
i cant run c and c++ on vs code (or, i mean im trying by adding the path of MinGW on env vars, but no results by typing on cmd gdb --version, but i have by typing g++ --version)
aaand i just hided this bar by mistake, how to adjust? thanks to everyone!
1- Add to the path variable the directory of the bin folder of MinGW.
Ex: C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
2- Check that your Mingw-w64 tools are correctly installed and available, open a new Command Prompt and type:
g++ --version
OR
gdb --version
3- Create helloworld.cpp:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
4- Save
5- From the main menu, choose Terminal > Configure Default Build Task. In the dropdown, which will display a tasks dropdown listing various predefined build tasks for C++ compilers. Choose g++.exe build active file, which will build the file that is currently displayed (active) in the editor.
This will create a tasks.json file:
6- To run the code:
Save helloworld.cpp
press Ctrl+Shift+B or from the Terminal main menu choose Run Build Task
You should see this in the terminal:
Create a new terminal using the CTRL + SHIFT + ~
In that new terminal type: .\helloworld.exe to run the code
Reference: C++ in VS-code

Configure VS Code code runner extension to display CPP warnings

I am wondering how I could configure the code runner extension on VS Code (MacOS 10.15) to display warnings (i.e. -Wall?)
Would there be a simple, almost permanent method so code runner will always display warnings no matter which CPP file I build?
Yes! This is possible.
Go to the Workspace Settings, search for code runner and click on Executor Map:
You may then use the following JSON code:
{
"code-runner.executorMap": {
// ...
"c": "cd $dir && gcc $fileName -Wall -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
} // used -Wall here
}
Save it and quit from the file and jump to the code you want to run. Press Ctrl+Alt+J to select the run type. Select C simply and you're good to go.

Code Runner using MSVC create a too long string

I use CodeRunner for VSCode on Windows, so I need to change g++ to MSVC (Visual C++ Compiler).
So I configure settings.json for coderunner:
{
"window.zoomLevel": 0,
"code-runner.runInTerminal": true,
"terminal.integrated.shell.windows": "cmd.exe",
"code-runner.executorMap": {
"cpp": "vcvars64.bat && cl.exe $fileName && del $fileNameWithoutExt.obj && cls && $fileNameWithoutExt.exe",
},
"files.autoSave": "afterDelay"
}
As you can see, I add path of vcvars64.bat to system PATH.
It works, but after several runs I get next error:
Input line is too long.
I search for it and found that it is because CodeRunner run vcvars64.bat every time! So after several runs total path become too long:
"Input line is too long" error in BAT File
Restarting console clear it, but after several runs falls again.
Looks like I need to find some way to use vcvars64.bat only once but I don't know how!
This is my setting.json
"code-runner.executorMap": {
"cpp": "cd $dir && cl /EHsc $fileName && cls && $dir$fileNameWithoutExt.exe && del
$dir$fileNameWithoutExt.obj $dir$fileNameWithoutExt.exe",
},
And it's working as expected.
change default shell to PowerShell in vs-code
"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
then add this in setting.json file :
For PowerShell
"cpp": "cd $dir ; vcvars64.bat ; cl /EHsc $fileName ; ./$fileNameWithoutExt.exe",

Visual Studio Code c++11 extension warning

I am in the process of learning c++ and I'm using visual studio code for Mac. I use Code Runner to run my program. My problem is that when I use something from c++11 like "auto" for variable declaration, visual studio code gives me a warning like this, but if I try running it on Xcode or Eclipse it doesn't:
warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
for(auto y: nstrVec)
This is the program if it's necessary:
#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <numeric>
#include <sstream>
int main(){
std::vector<std::string> nstrVec(10);
std::string str("I'm a string");
nstrVec[0] = str;
std::cout << str.at(0) << "\n";
std::cout << str.front() << " " << str.back() << "\n";
std::cout << "Length " << str.length() << "\n";
// copies all characters after the fourth
std::string str2(str, 4);
for(auto y: nstrVec)
if(y != "")
std::cout << y << "\n";
return 0;
}
And this is the c_cpp_proprerties.json file:
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/System/Library/Frameworks/Kernel.framework/Versions/A/Headers"
],
"defines": [],
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
In VS Code:
File>>Preference>>Settings>>Extensions
find C_Cpp>Default:Cpp Standard drop down menu
set that to c++11
I spent so long today trying to figure out why I was getting this error and no where had the exact answer I required so I thought I'd post it here just in case I can save anyone the hassle.
If you're using code runner, look in user settings and set:
"code-runner.executorMap" : { "cpp" : "cd $dir && g++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt" }
The pertinent bit being "g++ -std=c++17".
This is providing of course you can compile your programme in shell using Daniel's solution above but not in VScode + and using code runner.
I had the same problem, but solved it using set vscode-user-settings <>
"clang.cxxflags": ["-std=c++14"]
I used this to solve my problem. Open your terminal
bash
echo "alias g++='g++ -std=c++17'" >> ~/.bashrc
source ~/.bashrc
zsh
echo "alias g++='g++ -std=c++17'" >> ~/.zshrc
source ~/.zshrc
For everyone who comes to this question to find a quick answer (like I did):
The following compiler command should compile your program main.cpp with the latest C++ standard (c++17) and should get rid of warning messages like the one described above:
g++ -std=c++17 -g main.cpp -o main
It is mentioned multiple times in the comments, but I think this question should have a regular answer.
If you're using CPH judge extension in VS add -std=c++11 in Cph › Language › Cpp: Args in extension settings
If you're using CPH, add this line to Cph >> Language >> Cpp: Args
-std=c++17
If it doesn't work for you, also go to File >> Preference >> Settings >>
Extensions >> C_Cpp >> Default:Cpp_Standard and set that to c++17
None of the answers here worked for me on Mac that were entirely within VSCode (I didn't want to modify my .zshrc file).
What did work though, was adding argument --std=c++20 for the clangd: Fallback Flags under Extensions > clangd, then restarting VSCode.
Fix for MAC + code runner.
Select Code -> Settings -> Settings
In the search prompt, seach "code-runner":
Click on "Edit settings.json"
Look for a field called "code-runner.executorMap" -> "cpp"
After g++, add the following to it " -std=c++17 ". In other words, the line should look something like this:
"cpp": "cd $dir && g++ -std=c++17 $fileName -o $fileNameWithoutExt &&
$dir$fileNameWithoutExt"
Close VSCode, and open it again.