当前位置: 首页 > news >正文

C语言中的宏

1.防止头文件重复包含

1.#pragma once 

#pragma once 是一个编译器指令,用于防止头文件被重复包含。它的核心作用是通过简单语法替代传统的头文件保护宏(#ifndef/#define/#endif),提升代码简洁性和可维护性。

作用详解

  1. 防止重复包含
    当同一个头文件被多次 #include 到不同源文件中时,#pragma once 会确保编译器只处理该头文件一次,避免因重复定义导致的编译错误(如类型重定义、函数重复声明等)。

  2. 简化代码
    传统头文件保护需要手动定义唯一宏名称:

    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    // 头文件内容
    #endif

    而 #pragma once 只需一行代码:

    #pragma once
    // 头文件内容

  3. 避免宏命名冲突
    传统宏名称(如 MY_HEADER_H)若不够唯一,可能与其他头文件冲突。#pragma once 通过文件路径识别,彻底避免此问题。

  4. 工作原理
    编译器在第一次遇到 #pragma once 时,会记录该头文件的唯一标识(通常是文件路径)。
    后续再次包含同一文件时,编译器直接跳过其内容。

    注意事项

  5. 编译器兼容性
    #pragma once 是编译器扩展,非 C 标准的一部分,但现代主流编译器(如 GCC、Clang、MSVC)均支持。若需兼容极旧编译器,可保留传统宏保护作为备选。

  6. 文件路径敏感性
    若同一文件通过不同路径被包含(如符号链接或硬链接),#pragma once 可能失效。此场景罕见,但需注意构建系统配置。

  7. 性能优势
    相比传统宏保护(需检查宏是否存在),#pragma once 通常更高效,因编译器直接通过文件标识判断是否包含。

  8. 总结
    推荐使用:在支持 #pragma once 的编译器中优先使用它,代码更简洁且安全。
    兼容性处理:若需兼容旧编译器,可结合两种方式:

    #pragma once
    #ifndef UNIQUE_HEADER_NAME_H
    #define UNIQUE_HEADER_NAME_H
    // 头文件内容
    #endif

    通过 #pragma once,开发者可以更高效地管理头文件依赖,减少冗余代码。

2.结构体内存对齐

控制结构体成员的内存对齐方式(常见于硬件编程或网络协议):

#pragma pack(push, 1)  // 保存当前对齐方式,并设置为 1 字节对齐
struct Example 
{char a;int b;  // 实际占 5 字节(1+4),而非默认的 8 字节
};
#pragma pack(pop)      // 恢复之前的对齐方式

对于跨平台代码,可结合条件编译和标准属性:

// GCC/Clang 属性
struct Example 
{char a;int b;
} __attribute__((packed));  // 1 字节对齐// MSVC 属性
#pragma pack(push, 1)
struct Example 
{char a;int b;
};
#pragma pack(pop)

相关文章:

  • Prometheus参数配置最佳实践
  • P1032 [NOIP 2002 提高组] 字串变换
  • shell脚本变量详解
  • 【WebApi】YiFeiWebApi接口安装说明
  • python: union()函数用法
  • uniapp+vue3开发项目之引入vuex状态管理工具
  • 内存泄漏系列专题分析之十三:高通相机CamX内存泄漏内存占用分析--Camx pipeline的ION内存拆解方法
  • 从 Vue3 回望 Vue2:响应式的内核革命
  • 【bag of n-grams】 N-gram词袋模型 简介
  • 已情感分析入门学习大模型-初级篇
  • 进程与线程:09 进程同步与信号量
  • QLineEdit增加点击回显功能
  • Python 字典键 “三变一” 之谜
  • WebGIS 开发中的数据安全与隐私保护:急需掌握的要点
  • 带格式的可配置文案展示
  • 典籍指数问答模块回答格式修改
  • 深入浅出:C++数据处理类与计算机网络的巧妙类比
  • 嵌入式学习--江协51单片机day5
  • PostgreSQL 配置设置函数
  • SQL Server中delete table和truncate table删除全表数据哪个快?
  • 时隔4年多,这一次普京和泽连斯基能见面吗?
  • 专访|家人眼中的周碧初:用色彩写诗,实践油画“民族化”
  • 印称一名高级官员在巴基斯坦发动的袭击中死亡
  • 咸宁市委常委、市纪委书记官书云调任湖北省司法厅副厅长
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点