声明:
本文 - 禁止转载 -
本文所有观点和概念都系个人总结,难免存在疏漏之处,为不至于诱导初学者误入歧途,望各位以自己实践为准,特此声明。
如有错误请告知
标准
C++98/03、C++11、C++14、C++17,以C++11为主流(2018年)
编译
Visual Studio IDE
★ 快速编译指南
1. 打开cmd.exe(快捷键Win+R),输入如下命令:
set VS
结果:
VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\
VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
VS120COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VS140COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\
VS90COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
VSINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio 12.0\
VSSDK140Install=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VSSDK\
结果包含VS120COMNTOOLS说明安装有Visual Studio 2013
2. 继续输入如下命令:
(此处采用Visual Studio 2013编译,若需要其他编译器换成相应变量即可)
call "%VS120COMNTOOLS%"vsvars32.bat
cd [cpp目录]
cl main.cpp
若编译出错,按提示修改代码文件后,继续cl操作步骤
PS:main.cpp 换成你需要编译的cpp文件
3. 执行生成的可执行文件
4.清理(可忽略)
del /f /s /q *.exe
del /f /s /q *.obj
g++编译器
★ 快速编译指南
cd [cpp目录]
g++ main.cpp -std=c++11 -o main
./main
注意
C++标准归于标准,即使按照标准来写代码编译也不是一定就成功,或者按照未现实的标准写代码也不一定就失败,现实取决于编译器对标准的支持程度和编译参数。
例如 >> 操作符 A<B<int>>
是 右移操作符 还是 模板参数表结束界定符?而C++11的标准可以正确识别,认为是后者。
template<int N>
struct AA
{
//
}
int main()
{
AA< 100 >> 2> xx;
return 0;
}
某C++98/03标准编译器编译成功
某 C++11标准编译器编译失败
正确写法:AA< (100 >> 2) > xx; // 括号手动区分>>操作符
★ 编译过程
1、预处理: gcc -E test.c -o test.i // 预处理文件 test.i
2、编译: gcc -S test.i -o test.S // 器汇编文件 test.S
3、汇编: gcc -c test.S -o test.o // 机器语言 test.o
4、链接: gcc test.o -o test // 可运行程序 test
★ 编译参数
-fno-elide-constructors
关闭返回值优化
// A 为class
A GetA()
{
return A();
}
int main()
{
A = GetA();
return 0;
}
/*
关闭返回值优化
A实例构造三次,析构三次
*/
/*
打开返回值优化
A实例构造一次,析构一次
*/