Sublime Text 3中的C11和c++ 11问题
C11 and C++11 problems in Sublime Text 3
我将Sublime Text 3升级为C/c++版本,但我必须在C11和c++ 11等现代版本中编写代码。
当我尝试C11代码像这样:
#include <stdio.h>
int main( int argc, char ** argv )
{
puts("C99 Version:");
for( int i = 0; argv[i]; i++ ) {
printf("%d: %sn", i, argv[i]);
}
getchar();
return 0;
}
Sublime给出错误:
C:UserspcDesktopCPPprojectc99.c:7:2: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
for( int i = 0; argv[i]; i++ ) {
^
C:UserspcDesktopCPPprojectc99.c:7:2: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
你能告诉我如何使用-std=c99, -std=gnu99, -std=c11或-std=gnu11选项吗?
==================================================================================
c++ 11也是如此。下面是代码:
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main( int argc, char ** argv ) {
stringstream version;
version << "GCC version: "
<< __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__
<< "nVersion string: " << __VERSION__;
cout << version.str() << endl;
vector<string> v = { "one", "two", "three" }; // C++11 feature - initializer list
for( string s : v ) { // C++11 feature - range-based for loop
cout << s << endl;
}
return 0;
}
和错误列表:
C:UserspcDesktopCPPprojectmain.cpp: In function 'int main(int, char**)':
C:UserspcDesktopCPPprojectmain.cpp:17:45: error: in C++98 'v' must be initialized by constructor, not by '{...}'
vector<string> v = { "one", "two", "three" }; // C++11 feature - initializer list
^
C:UserspcDesktopCPPprojectmain.cpp:17:45: error: could not convert '{"one", "two", "three"}' from '<brace-enclosed initializer list>' to 'std::vector<std::basic_string<char> >'
C:UserspcDesktopCPPprojectmain.cpp:19:18: error: range-based 'for' loops are not allowed in C++98 mode
for( string s : v ) { // C++11 feature - range-based for loop
^
请帮我解决这些问题!
还有一个问题:当我运行代码- .exe文件出现在源代码的同一文件夹中,我必须打开它。当我点击"ctrl+b"时,是否有可能看到Sublime Text中的输出??
谢谢的! !
如注释中所述,您需要更改的是构建系统。在ST3中,修改默认包有点棘手。有插件可以做到这一点,但我还没有使用它们。这是一个插件的免费方式。
首先,您需要一个新的.sublime-build
。我想这个应该可以。
{
"cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
},
{
"name": "Build without C++11",
"cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
}
]
}
然后,您需要导航到存储ST3的默认包的位置。看来你用的是Windows。.sublime-package
s的位置可能类似于C:Program FilesSublime Text 3Packages.
一旦进入这个文件夹,你应该看到一堆.sublime-package
文件,其中包含所有内置支持的语言的名称。选择C++.sublime-package
并将其复制到其他目录。然后,将其重命名为C++.zip
并提取它。删除C++.sublime-build
文件,并用包含上述代码的同名文件替换它。重新压缩文件,并将其重命名为C++.sublime-package
,并将其放回您获得它的文件夹。
:
- 当您按ctrl+b时,ST3将自动使用gcc的c++ 11标志进行构建。
- 如果你想运行你的程序(我认为这就是你所说的"看到Sublime Text中的输出"),在程序编译后按ctrl+shift+b。
- 如果你想使用gcc但是而不使用 c++ 11标志,按ctrl+shift+p并输入"build: build without c++ 11"并选择弹出的选项。
有时当您这样做时,您可能会遇到错误,例如语法错误,或者其他类型的错误,以避免使用标准c++配置,只需在shell_cmd中的g++之后添加关键字-std=c++11示例
{
"shell_cmd": "g++ -std=c++11 "${file}" -o "${file_path}/${file_base_name}"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
},
{
"name": "Build without C++11",
"cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
}
]
}
够了。c++ 98是相同的配置,没有-std= c++ +11选项。
关于如何处理这类文件的更多信息,请参阅关于构建系统的崇高文档
Alec的解决方案对我来说工作得很好,但是叫做" run "的运行变体不能用c++ 11构建,所以我增加了一个运行选项,叫做" run with c++ 11":
{
"cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
},
{
"name": "Run with C++11",
"cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
},
{
"name": "Build without C++11",
"cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
}
]
}
Sublime Text 3使得修改默认设置变得更加困难;要更改它们,可以使用"PackageResourceViewer"包。安装此包(建议使用PackageControl),然后按Ctrl+shift+P并执行命令:
PackageResourceViewer: OpenResource -> c++ -> c++ Single File.sublime-build
在你找到的每个"g++ "命令后添加选项"-std= c++ 11"。保存并关闭该文件。现在应该可以编译了。
(修改后的文件应该如下所示)
{
"shell_cmd": "g++ -std=c++11 "${file}" -o "${file_path}/${file_base_name}"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"shell_cmd": "g++ -std=c++11 "${file}" -o "${file_path}/${file_base_name}" && "${file_path}/${file_base_name}""
}
]
}
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题