-
Notifications
You must be signed in to change notification settings - Fork 282
Cpp Coding Guidelines
Bernhard Manfred Gruber edited this page Aug 18, 2025
·
17 revisions
- Always use entities from
cuda::std::
overstd::
. They work in host and device code, work with NVRTC, and help testing our implementation. - Use CCCL internal macros over compiler/vendor-specific keywords. E.g., use
_CCCL_HOST_DEVICE
instead of__host__ __device_
, or_CCCL_FORCEINLINE
over__forceinline
. Examples and documentation must not use these macros and should support vendor attributes and keywords instead. - Fully qualify any reference to a libcu++ entity in any C++ library header with
::cuda::std::
. This avoids ambiguities when users define namespaces calledcuda
themselves. Use justcuda::std
in examples, tests and documentation. - Doxygen comments should start with
//!
- Macros for function attributes, like
_CCCL_HOST_DEVICE
, should be ordered before declaration specifiers likeconstexpr
orstatic
- Don't include libcu++ detail headers (starting with
__
) in downstream projects (like CUB, Thrust, etc.). Always prefer the public headers.
TBD
-
Namespace Qualification: Do not use the global namespace qualification (
::cuda::xyz
or::cuda::std::xyz
). Instead, usecuda::xyz
andcuda::std::xyz
. -
Internal Macros: Do not use internal macros like
_CCCL_HOST_DEVICE
.
TBD
-
Namespace Qualification: Do not use the global namespace qualification (
::cuda::xyz
or::cuda::std::xyz
). Instead, usecuda::xyz
andcuda::std::xyz
. -
Internal Macros: Do not use internal macros like
_CCCL_HOST_DEVICE
, unless the internal macros are strictly required for the tests to work. For instance,_CCCL_HOST_DEVICE
may be required for tests targeting non-CUDA backends.
- Always fully qualify function calls, even to functions in the same namespace. This avoids ADL.
- Defaulted constructors should be marked with
_CCCL_HIDE_FROM_ABI
- libcu++ headers like
<cuda/foo>
are strict supersets of<cuda/std/foo>
and thus always include the corresponding<cuda/std/...>
header.
CCCL uses a mix of different licenses for historical reasons.
- Any net new file should be licsensed under Apache-2.0 WITH LLVM-exception.
- For files with license headers, strongly prefer a 2-line SPDX header like:
// SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception