C++编程笔记(1)

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,打印输出相对麻烦)

参考:

标准库头文件 (C++23)提供固定宽度浮点类型。(cout默认不支持直接打印输出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位有效数字
}

正文完
 0
评论(没有评论)