一、预编译指令的学习

1 编译器属性有关的宏

1 __clang__ clang编译器

  • __clang_major__:clang编译器主要的版本
  • __clang_minor__:clang编译器次要的版本
  • __clang_patchlevel__:clang编译器补丁的版本
  • __clang_version__:clang编译器的版本

2 __GNUC__ gun编译器

3 __MSC_VERMSVC编译器

  • __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__((...))

  1. 函数属性
  • noreturn:指示函数不会返回,用于优化和警告。
  • deprecated:标记函数为已弃用,编译器会发出警告。
  • always_inline:强制内联函数,即使在编译器设置中未启用内联。
  • const:指示函数不会修改任何非局部变量。
  • pure:指示函数没有副作用,只依赖于输入。
  • format:告诉编译器函数参数和返回值的格式,用于类似于 printf 的函数。
  • unused:标记函数为未使用,可能会发出警告。
  • nodiscard:C++17 标准引入的一种属性,用于告诉编译器某个函数的返回值不应该被忽略,即使不使用返回值的结果,也会发出警告。
  1. 变量属性
  • aligned:指定变量的对齐方式。
  • packed:压缩结构体或联合体的内存布局。
  • unused:标记变量为未使用,可能会发出警告。
  1. 类型属性
  • aligned:指定类型的对齐方式。
  • packed:压缩结构体或联合体的内存布局。
  1. 结构体和联合体属性
  • packed:压缩结构体或联合体的内存布局。
  1. 可变参数属性
  • 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 预处理指令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值