Modern C++ geliştirme.
Üretim odaklı, C++26-first bir ortam: projeye ait modüller, açık hata sözleşmeleri, RAII, target tabanlı CMake, Ninja ve platforma özgü toolchain'ler. Gerekli compiler veya standard library seçilen C++26 özelliklerine hazır değilse C++23 uyumluluk yolu olarak kalır.
Mühendislik baseline'ı.
| Area | Default | Rule |
|---|---|---|
| Language | C++26 | Geçerli dil yolunu tercih edin; yalnızca somut toolchain desteği gerektiriyorsa C++23 kullanın. |
| 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;. |
| Hatalar | std::expected | Kurtarılabilir hataları sentinel değerlerin arkasına gizlemek yerine API sözleşmesinin parçası yapın. |
| Console output | std::print / std::println | Yeni iostream zincirleri yerine modern biçimlendirilmiş çıktıyı tercih edin. |
| Build model | Target-based CMake | Compile feature'ları, source'ları, definition'ları ve dependency'leri sahibi olan target'a bağlı tutun. |
| Generator | Ninja | Her compiler, configuration ve target için ayrı build tree kullanın. |
Header'larla değil modüllerle başlayın.
Projeye ait sınırlar sorumluluğu doğrudan göstermelidir. Declaration'ları module interface'lerden export edin, karmaşık implementation'ları implementation unit'lerde tutun ve platform/third-party kodunu açık adapter sınırlarında izole 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 ile target tabanlı CMake.
Dil standardını, module file set'i ve dependency graph'ı target üzerinde tutun. Klasik header mimarisini taklit etmek için global compiler flag'lere veya proje geneli include directory'lerine dönmeyin.
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'leri.
C++ mimarisi taşınabilir kalır; compiler, SDK, linker, packaging ve runtime açık platform sınırlarıdır. Compiler veya target SDK değiştirdikten sonra configure edilmiş bir CMake tree'yi yeniden kullanmayın.
macOS.
Apple SDK ve platform araçları için tam Xcode kurun. Apple Clang varsayılan yerel compiler'dır; daha yeni compiler özellikleri veya diagnostics gerektiğinde upstream LLVM yanında bulunabilir.
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 önemliyse GCC ve Clang'i birlikte hazır tutun. Her compiler için ayrı build directory configure edin ve module desteğini yalnızca sürüm numaralarından çıkarmak yerine gerçek CMake/compiler/generator kombinasyonuyla doğrulayı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 edilmeden önce MSVC compiler, linker ve Windows SDK ortamı initialize edilmelidir.
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'e özel JNI, lifecycle, storage ve permission kodunu adapter'ların arkasında tutun; domain ve application modülleri normal C++ olarak kalsı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
Tarayıcı threading'i, SIMD, filesystem erişimi ve network davranışı yalnızca compiler switch değildir; runtime kısıtlarıdır. Bunları target yetenekleri olarak modelleyin ve ship edeceğiniz browser configuration içinde doğrulayın.
Diagnostics geliştirme ortamının parçasıdır.
Compile-time doğruluk yalnızca bir katmandır. Zor yeniden üretilebilen hata çıktıktan sonra eklemek yerine sanitizer ve static-analysis build'lerini baştan hazır tutun.
| Araç | Kullanım | 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.
Kullanıcıya dönük uygulamalar: Qt'ye bilinçli geçin.
Yeni grafik Genyleap tarzı uygulamada varsayılan arayüz stack'i, module tabanlı C++ application/domain kodu üzerinde Qt Quick, QML ve Qt Quick Controls'dür. UI bir adapter'dır; kopyalanmış business logic'in sahibi değildir.