c++编程环境(windows10)
安装clion到 C:\JetBrains\CLion (没有安装 visual studio)
安装mysys2: https://www.msys2.org/
安装工具链和cmake:
pacman -Syu
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-cmake
配置CLion,设置工具链:
- MinGW:
C:\msys64\mingw64(或similiar) - CMake:
C:\msys64\mingw64\bin\cmake.exe - 构建工具:
C:\msys64\mingw64\bin\ninja.exe - 调试器(可能会提示版本过高):
C:\msys64\mingw64\bin\gdb.exe - c编译器:
C:\msys64\mingw64\bin\cc.exe - c++编译器:
C:\msys64\mingw64\bin\c++.exe
查看版本:
C:\>C:\msys64\mingw64\bin\cc.exe -v
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\cc.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-15.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --with-native-system-header-dir=/mingw64/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-mingw-wildcard --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-backtrace=yes --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev8, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-libstdcxx-zoneinfo=yes --disable-libstdcxx-debug --enable-plugin --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.0 (Rev8, Built by MSYS2 project)
C:\>C:\msys64\mingw64\bin\c++.exe -v
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\c++.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-15.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --with-native-system-header-dir=/mingw64/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-mingw-wildcard --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-backtrace=yes --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-libssp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev8, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-libstdcxx-zoneinfo=yes --disable-libstdcxx-debug --enable-plugin --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.0 (Rev8, Built by MSYS2 project)
测试案例:
1、CMakeLists.txt
# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 4.1)
# 定义项目的名称和使用的编程语言
project(testCPP)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_EXE_LINKER_FLAGS "-static")
# 指定要生成的可执行文件和其源文件
add_executable(testCPP main.cpp)
# 创建一个库(静态库或动态库)及其源文件:
#
#add_library(<target> <source_files>...)
#设置变量的值
# set(<variable> <value>...)
#set(QUADMATH_LIB "quadmath")
# 链接目标文件与其他库
# target_link_libraries(MyExecutable MyLibrary)
target_link_libraries(testCPP PUBLIC ${GCC_STATIC_LIBS} "quadmath" -lm )
2、main.cpp
#include <iostream>
#include <string>
#include <stdfloat>
#include <quadmath.h>
#include <iomanip>
std::string float128ToStr(__float128 f) {
char buffer[128];
quadmath_snprintf(buffer, sizeof buffer, "%.40Qf", f);
return std::string(buffer);
}
int main() {
std::float128_t f128 = 123.4567890223456789032345678904234567890f128;
std::string str = float128ToStr(f128);
std::cout << str << std::endl;
// 123.4567890223456789032345678904234615053512
// 约44位有效小数↑
std::float64_t f64 = 123.4567890223456789032345678904234567890f128;
std::cout << std::setprecision(50);
std::cout<<f64 << std::endl;
// 123.45678902234567431150935590267181396484375
// 约17位有效数字
std::float32_t f32 = 123.4567890223456789032345678904234567890f128;
std::cout << std::setprecision(50);
std::cout<<f32 << std::endl;
// 123.456787109375
// 约8位有效数字
std::cout<<"Hello world!你好,世界!"<<std::endl;
}
中文乱码: 源代码转为 GB18030
整数类型(常用:int64_t)
参考: https://cppreference.cn/w/cpp/header/cstdint
通过标准库头文件 <cstdint> 使用固定宽度整数类型
#include <iostream>
#include <cstdint>
int main() {
/*
宽度分别为 8、16、32 和 64 位的有符号整数类型:
int8_t
int16_t
int32_t
int64_t
宽度分别为 8、16、32 和 64 位的无符号整数类型
uint8_t
uint16_t
uint32_t
uint64_t
宏:
INT8_MIN
INT16_MIN
INT32_MIN
INT64_MIN
INT8_MAX
INT16_MAX
INT32_MAX
INT64_MAX
UINT8_MAX
UINT16_MAX
UINT32_MAX
UINT64_MAX
*/
std::cout << "INT8_MIN:" << INT8_MIN << std::endl;
std::cout << "INT16_MIN:" << INT16_MIN << std::endl;
std::cout << "INT32_MIN:" << INT32_MIN << std::endl;
std::cout << "INT64_MIN:" << INT64_MIN << std::endl;
std::cout << "INT8_MAX:" << INT8_MAX << std::endl;
std::cout << "INT16_MAX:" << INT16_MAX << std::endl;
std::cout << "INT32_MAX:" << INT32_MAX << std::endl;
std::cout << "INT64_MAX:" << INT64_MAX << std::endl;
std::cout << "UINT8_MAX:" << UINT8_MAX << std::endl;
std::cout << "UINT16_MAX:" << UINT16_MAX << std::endl;
std::cout << "UINT32_MAX:" << UINT32_MAX << std::endl;
std::cout << "UINT64_MAX:" << UINT64_MAX << std::endl;
/*
INT8_MIN:-128
INT16_MIN:-32768
INT32_MIN:-2147483648
INT64_MIN:-9223372036854775808
INT8_MAX:127
INT16_MAX:32767
INT32_MAX:2147483647
INT64_MAX:9223372036854775807
UINT8_MAX:255
UINT16_MAX:65535
UINT32_MAX:4294967295
UINT64_MAX:18446744073709551615
*/
return 0;
}
浮点数类型(常用float64_t,字面量后缀f64;float128_t,打印输出相对麻烦)
参考:
标准库头文件
#include <iostream>
#include <string>
#include <stdfloat>
#include <quadmath.h>
#include <iomanip>
std::string float128ToStr(__float128 f) {
char buffer[128];
quadmath_snprintf(buffer, sizeof buffer, "%.40Qf", f);
return std::string(buffer);
}
int main() {
std::float128_t f128 = 123.4567890223456789032345678904234567890f128;
std::string str = float128ToStr(f128);
std::cout << str << std::endl;
// 123.4567890223456789032345678904234615053512
// 约44位有效小数↑
std::float64_t f64 = 123.4567890223456789032345678904234567890f128;
std::cout << std::setprecision(50);
std::cout<<f64 << std::endl;
// 123.45678902234567431150935590267181396484375
// 约17位有效数字
std::float32_t f32 = 123.4567890223456789032345678904234567890f128;
std::cout << std::setprecision(50);
std::cout<<f32 << std::endl;
// 123.456787109375
// 约8位有效数字
}
正文完