Müasir C++ inkişafı.
Production yönümlü C++26-first mühit: layihəyə məxsus modullar, açıq error contract-lar, RAII, target əsaslı CMake, Ninja və platforma-native toolchain-lər. Lazım olan compiler və ya standard library seçilmiş C++26 imkanlarına hazır deyilsə, C++23 uyğunluq yolu olaraq qalır.
Mühəndislik baseline-ı.
| Area | Default | Rule |
|---|---|---|
| Language | C++26 | Cari dil yolunu üstün tutun; yalnız real toolchain dəstəyi tələb etdikdə C++23 istifadə edin. |
| Project boundaries | C++ modules | New project-owned production boundaries use .cppm modules by default. |
| Standard library | Minimal headers | Use normal standard headers in the global module fragment; do not depend on experimental import std;. |
| Xətalar | std::expected | Bərpa olunan xətaları sentinel value-ların arxasında gizlətmək əvəzinə API müqaviləsinin bir hissəsinə çevirin. |
| Console output | std::print / std::println | Yeni iostream zəncirləri əvəzinə müasir formatlanmış çıxışdan istifadə edin. |
| Build model | Target-based CMake | Compile feature-ları, source-ları, definition-ları və dependency-ləri sahibi olan target-a bağlı saxlayın. |
| Generator | Ninja | Hər compiler, configuration və target üçün ayrı build tree istifadə edin. |
Header-larla deyil, modullarla başlayın.
Layihəyə məxsus sərhədlər məsuliyyəti birbaşa göstərməlidir. Declaration-ları module interface-lərdən export edin, qeyri-trivial implementation-ları implementation unit-lərdə saxlayın və platform/third-party kodunu açıq adapter sərhədlərində izolyasiya edin.
src/greeting/greeting.cppmmodule;
#include <expected>
#include <string>
#include <string_view>
export module genyleap.greeting;
export namespace genyleap::greeting {
enum class GreetingError {
EmptyName
};
[[nodiscard]] auto makeGreeting(std::string_view name)
-> std::expected<std::string, GreetingError>;
}
src/greeting/greeting.cppmodule;
#include <expected>
#include <format>
#include <string>
#include <string_view>
module genyleap.greeting;
namespace genyleap::greeting {
auto makeGreeting(std::string_view name)
-> std::expected<std::string, GreetingError>
{
if (name.empty()) {
return std::unexpected {GreetingError::EmptyName};
}
return std::format("Hello, {}.", name);
}
}
src/main.cpp#include <print>
import genyleap.greeting;
int main()
{
const auto greeting = genyleap::greeting::makeGreeting("Genyleap");
if (!greeting) {
std::println("Unable to create greeting.");
return 1;
}
std::println("{}", *greeting);
return 0;
}
Module scanning ilə target əsaslı CMake.
Dil standartını, module file set-i və dependency graph-ı target üzərində saxlayın. Klassik header arxitekturasını təqlid etmək üçün global compiler flag-lərə və ya project-wide include directory-lərə qayıtmayın.
CMakeLists.txtcmake_minimum_required(VERSION 3.30)
project(GenyleapHello
VERSION 0.1.0
LANGUAGES CXX
)
add_library(genyleap_greeting)
target_compile_features(genyleap_greeting
PUBLIC
cxx_std_26
)
target_sources(genyleap_greeting
PUBLIC
FILE_SET CXX_MODULES
FILES
src/greeting/greeting.cppm
PRIVATE
src/greeting/greeting.cpp
)
set_property(
TARGET genyleap_greeting
PROPERTY CXX_SCAN_FOR_MODULES ON
)
add_executable(genyleap_hello
src/main.cpp
)
target_link_libraries(genyleap_hello
PRIVATE
genyleap_greeting
)
target_compile_features(genyleap_hello
PRIVATE
cxx_std_26
)
cmake -S . -B build/dev -G Ninja \
-DCMAKE_BUILD_TYPE=Debug
cmake --build build/dev --parallel
ctest --test-dir build/dev \
--output-on-failure \
--no-tests=error
Platform toolchain-ləri.
C++ arxitekturası portativ qalır; compiler, SDK, linker, packaging və runtime açıq platform sərhədləridir. Compiler və ya target SDK dəyişdikdən sonra configure edilmiş CMake tree-ni yenidən istifadə etməyin.
macOS.
Apple SDK və platform alətləri üçün tam Xcode quraşdırın. Apple Clang default native compiler-dir; daha yeni compiler imkanları və ya diagnostics lazım olduqda upstream LLVM paralel saxlanıla bilər.
sudo xcode-select --switch /Applications/Xcode.app
sudo xcodebuild -license accept
brew install cmake ninja llvm
xcrun clang++ --version
cmake --version
ninja --version
xcrun --show-sdk-path
Select upstream LLVM per build when needed; Apple SDK integration and upstream language experimentation are separate concerns.
Linux.
Portability vacibdirsə GCC və Clang-i birlikdə saxlayın. Hər compiler üçün ayrıca build directory configure edin və module dəstəyini yalnız versiya nömrələrinə görə yox, real CMake/compiler/generator kombinasiyası ilə yoxlayın.
sudo apt update
sudo apt install -y \
build-essential \
clang \
lld \
cmake \
ninja-build \
gdb
cmake -S . -B build/gcc -G Ninja \
-DCMAKE_CXX_COMPILER=g++
cmake -S . -B build/clang -G Ninja \
-DCMAKE_CXX_COMPILER=clang++
Windows.
Use Visual Studio Build Tools with the C++ workload for the Windows SDK and MSVC ABI. Add LLVM when you want clang-cl diagnostics while retaining MSVC-compatible platform integration.
winget install --id Microsoft.VisualStudio.2022.BuildTools `
--override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"
winget install --id Kitware.CMake
winget install --id Ninja-build.Ninja
winget install --id LLVM.LLVM
CMake configure edilməzdən əvvəl MSVC compiler, linker və Windows SDK mühiti initialize edilməlidir.
Android.
Use the Android NDK's Clang toolchain and CMake toolchain file rather than treating Android as a normal Linux desktop build. For projects that also use the current Qt baseline, the compatibility manifest currently resolves NDK r27c (27.2.12479018).
cmake -S . -B build/android-arm64 -G Ninja \
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28
cmake --build build/android-arm64 --parallel
Android-a xüsusi JNI, lifecycle, storage və permission kodunu adapter-lərin arxasında saxlayın ki, domain və application modulları adi C++ olaraq qalsın.
iOS.
Use Xcode 16 or newer for the current Qt compatibility profile, and treat Apple frameworks, entitlements, signing and bundle resources as platform boundaries. Device and simulator builds are distinct targets even when they share application modules.
xcodebuild -version
xcrun --sdk iphoneos --show-sdk-path
xcrun --sdk iphonesimulator --show-sdk-path
xcrun --sdk iphoneos clang++ --version
WebAssembly.
Use Emscripten when the target runtime is the browser. For the current Qt compatibility profile, Emscripten 5.0.5 is pinned automatically from upstream Qt documentation; a standalone C++/WASM project may intentionally choose a newer SDK after its own verification.
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install 5.0.5./emsdk activate 5.0.5
source ./emsdk_env.sh
em++ --version
git clone https://github.com/emscripten-core/emsdk.git
Set-Location emsdk
.\emsdk.bat install 5.0.5.\emsdk.bat activate 5.0.5
.\emsdk_env.ps1
em++ --version
Brauzer threading-i, SIMD, filesystem girişi və network davranışı sadəcə compiler switch deyil, runtime məhdudiyyətləridir. Onları target capability-ləri kimi modelləşdirin və ship ediləcək browser configuration-da yoxlayın.
Diagnostics inkişaf mühitinin bir hissəsidir.
Compile-time düzgünlük yalnız bir qatdır. Çətin təkrarlanan xəta ortaya çıxandan sonra əlavə etmək əvəzinə sanitizer və static-analysis build-ləri əvvəldən əlçatan saxlayın.
| Alət | İstifadə | Recommendation |
|---|---|---|
ASan | Memory safety failures | Debug and CI where supported |
UBSan | Undefined behavior | Pair with ASan in a dedicated diagnostic build |
TSan | Data races | Separate build because instrumentation changes runtime behavior |
clang-tidy | Static analysis and modernization | Editor plus CI on changed production surfaces |
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
target_compile_options(genyleap_greeting PRIVATE
-fsanitize=address,undefined
-fno-omit-frame-pointer
)
target_link_options(genyleap_greeting PRIVATE
-fsanitize=address,undefined
)
endif()
Boost is part of the native foundation.
Use the C++ standard library first when it cleanly provides the required facility, then use Boost for capabilities that remain stronger or broader there. Keep Boost dependencies target-local, architecture-specific when compiled, and visible through modern CMake imported targets.
İstifadəçi yönümlü tətbiqlərdə Qt-yə şüurlu keçin.
Yeni qrafik Genyleap tipli tətbiq üçün default UI stack module əsaslı C++ application/domain kodunun üzərində Qt Quick, QML və Qt Quick Controls-dur. UI adapter-dir və təkrarlanmış business logic-ə sahib olmur.