1 编译器属性有关的宏
1 __clang__
clang编译器
__clang_major__
:clang编译器主要的版本__clang_minor__
:clang编译器次要的版本__clang_patchlevel__
:clang编译器补丁的版本__clang_version__
:clang编译器的版本
2 __GNUC__
gun编译器
3 __MSC_VER
MSVC编译器
__MSC_VER
:MSVC编译器的版本__MSVC_LANG
:MSVC编译器使用 C++标准库的版本
4 __ibmxl__
ibm xl编译器
5 __INTEL_COMPILER
intel编译器
6 __NVCOMPILER
NVIDIA 编译器
2 has系列宏
1 __has_feature
检查编译器是否支持某些语言特性或拓展。
int arr[] = {1, 2, 3, 4};
#if __has_feature(cxx_range_for) && __has_feature(cxx_auto_type)
for (auto x : arr) std::cout << x << " ";
std::cout << std::endl;
#else
std::cout << "不支持" << std::endl;
#endif
2 __has_include
编译时检查是否可以包含特定的头文件
C++17引入的,要确保支持C++17
#if __has_include(<string_view>) && __has_include(<fmt/format.h>)
#endif
3 __has_cpp_attribute
检查编译器是否支持某一个属性标记
#if __has_cpp_attribute(noreturn)
[[noreturn]] void fun();
#endif
4 __has_builtin
检查编译器是否支持某个特定的内置函数。
内置函数:由编译器提供的特殊函数,通常用于执行一些底层操作和优化。
int a = 8;
#if __has_builtin(__builtin_popcount) //计算二进制为1的位数
std::cout << "1的个数为:" << __builtin_popcount(a) << std::endl;
#else
std::cout << "不支持" << std::endl;
#endif
3 __attribute__
编译器的一个特性,为变量、函数、类型等添加额外的属性标记。这些属性会影响编译器的行为,如优化代码、警告、代码生成等等。
语法:__attribute__((...))
- 函数属性:
noreturn
:指示函数不会返回,用于优化和警告。deprecated
:标记函数为已弃用,编译器会发出警告。always_inline
:强制内联函数,即使在编译器设置中未启用内联。const
:指示函数不会修改任何非局部变量。pure
:指示函数没有副作用,只依赖于输入。format
:告诉编译器函数参数和返回值的格式,用于类似于printf
的函数。unused
:标记函数为未使用,可能会发出警告。nodiscard
:C++17 标准引入的一种属性,用于告诉编译器某个函数的返回值不应该被忽略,即使不使用返回值的结果,也会发出警告。
- 变量属性:
aligned
:指定变量的对齐方式。packed
:压缩结构体或联合体的内存布局。unused
:标记变量为未使用,可能会发出警告。
- 类型属性:
aligned
:指定类型的对齐方式。packed
:压缩结构体或联合体的内存布局。
- 结构体和联合体属性:
packed
:压缩结构体或联合体的内存布局。
- 可变参数属性:
stdcall
:在 Windows 平台上指定调用约定。cdecl
:在 Windows 平台上指定调用约定。
4 #pragma指令
#pragma once // 确保一个编译单元,包含头文件一次
#pragma message("This is a custom message") //在编译时输出警告或自定义消息
#pragma pack(n) //设置结构体或类的对齐字节数
int b = 0;
#pragma unused(b) //可能不使用标识符b
...
5 其他
__cplusplus
:C++标准defined
预处理运算符,用来检查该宏是否定义过_Pragma
:用来执行#pragma
预处理指令