宏定义相关

C语言时间相关宏定义 在C语言中,预处理器提供了一些与时间相关的宏定义,用于在编译时获取日期、时间等信息。除了和__DATE____DATE__当前编译日期的字符串,格式为(例如__TIME__当前编译时间的字符串,格式为"hh:mm:ss"(例如"14:30:00"当前源文件的最后修改日期和时间,格式为(例如__FILE__当前源文件的文件名(字符串)。__LINE__当前代码行的行号(整数)。__func__(C99 标准引入)当前函数的名称(字符串)。__STDC__ 阅读详情

#error token-sequence
其主要的作用是在编译的时候输出编译错误信息token-sequence,从方便程序员检查程序中出现的错误。 该指令用于程序的调试, 当编译中遇到#error指令就停止编译。

#define CONST_NAME1 "CONST_NAME1"
printf("%s/n",CONST_NAME1);
#undef CONST_NAME1
#ifndef CONST_NAME1
#error No defined Constant Symbol CONST_NAME1                           
#endif

 

 

 

 

在VS编译输出信息如下 :

1>------ Build started: Project: ctest, Configuration: Debug Win32 ------
1>Compiling...
1>ctest.cpp
1>f:/vs/ctest/ctest/ctest.cpp(25) : fatal error C1189: #error :  No defined Constant Symbol CONST_NAME1
1>Build log was saved at "file://f:/vs/ctest/ctest/Debug/BuildLog.htm"
1>ctest - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

 

 

 

 

 

 

 

 

宏定义#pragma     其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”)
example:#ifdef _X86
                #Pragma message(“_X86 macro activated!”)
               #endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

2)通过#pragma pack(n)改变C编译器的字节对齐方式
     另外,还有如下的一种方式:
     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。
如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际
占用字节数进行对齐。
在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的
方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来
也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这
一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,
不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,
其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。
其协议结构定义如下:
#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER
{
     short SrcPort; // 16位源端口号
     short DstPort; // 16位目的端口号
     int SerialNo; // 32位序列号
     int AckNo; // 32位确认号
     unsigned char HaderLen : 4; // 4位首部长度
     unsigned char Reserved1 : 4; // 保留6位中的4位
     unsigned char Reserved2 : 2; // 保留6位中的2位
     unsigned char URG : 1;
     unsigned char ACK : 1;
     unsigned char PSH : 1;
     unsigned char RST : 1;
     unsigned char SYN : 1;
     unsigned char FIN : 1;
     short WindowSize; // 16位窗口大小
     short TcpChkSum; // 16位TCP检验和
     short UrgentPointer; // 16位紧急指针
};
#pragma pack() // 取消1字节对齐方式

 

 

 

#pragma 预处理指令详解

  在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

  其格式一般为: #Pragma Para

  其中Para 为参数,下面来看一些常用的参数。

  (1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

  #Pragma message(“消息文本”)

  当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

  当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法

  #ifdef _X86

  #Pragma message(“_X86 macro activated!”)

  #endif

  当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

  (2)另一个使用得比较多的pragma参数是code_seg。格式如:

  #pragma code_seg( ["section-name"[,"section-class"] ] )

  它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

  (3)#pragma once (比较常用)

  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

  (4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。

  有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。

  (5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

  (6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )

  等价于:

  #pragma warning(disable:4507 34) // 不显示4507和34号警告信息

  #pragma warning(once:4385) // 4385号警告信息仅报告一次

  #pragma warning(error:164) // 把164号警告信息作为一个错误。

  同时这个pragma warning 也支持如下格式:

  #pragma warning( push [ ,n ] )

  #pragma warning( pop )

  这里n代表一个警告等级(1---4)。

  #pragma warning( push )保存所有警告信息的现有的警告状态。

  #pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。

  #pragma warning( pop )向栈中弹出最后一个警告信息,

  在入栈和出栈之间所作的一切改动取消。例如:

  #pragma warning( push )

  #pragma warning( disable : 4705 )

  #pragma warning( disable : 4706 )

  #pragma warning( disable : 4707 )

  //.......

  #pragma warning( pop )

  在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。

  (7)pragma comment(...)

  该指令将一个注释记录放入一个对象文件或可执行文件中。

  常用的lib关键字,可以帮我们连入一个库文件。

  每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:

  #pragma loop_opt(on) // 激活

  #pragma loop_opt(off) // 终止

  有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以这样:

  #pragma warn —100 // Turn off the warning message for warning #100

  int insert_record(REC *r)

  { /* function body */ }

  #pragma warn +100 // Turn the warning message for warning #100 back on

  函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。

  每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。

 

NRF24L01相关宏定义及注释 #ifndef _INCLUDE_H_ #define _INCLUDE_H_ /*================================== NRF24L01常量 ====================================*/ #define TX_ADR_WIDTH 5 // 发送地址宽度 5字节 #define RX_ADR_WIDTH 5 // 接收地址宽 阅读详情

相关推荐

宏定义及相关用法

宏定义及相关用法 欢迎各位补充 目录 一些成熟软件中常用的宏定义: 使用一些内置宏跟踪调试: 宏定义防止使用时错误: 宏与函数 带副作用的宏参数 特殊符号:’#’、’##’ 1、一般用法 2、当宏参数是另一个宏的时候 __VA_ARGS__与##__VA_ARGS__ 一些成熟软件中常用的宏定义: 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define CO...

believe_s的博客 1695

C语言的宏定义相关

C语言的宏定义相关 目前大四cs已经保研,无奈自己太菜了,想重温一些C语言,写代码过程中发现宏定义之后程序运行时间“变长”(这是错误的)。后来就查阅了相关资料,其实是自己主观上的看法,宏定义并没有占用运行时间。 宏定义格式:#define 标识符 字符串; 如常用的#define PRICE 50 宏名一般用大写字母表示,以示与变量区别。但这并非规定;宏定义不是C语句,所以不能在行尾加分号,否则,...

qq_42907161的博客 2424

MFC 消息映射表 及 相关宏定义

MFC相关技术说明:MFC 中通过通过不同于SDK的switch的方法来处理WINDOWS消息,由消息映射表(Message Map)和虚函数多态来处理指定的窗体消息 1 声明一个消息映射表(Message Map)在能处理消息的类中中添加宏DECLARE_MESSAGE_MAP() 注 深入浅出MFC中有更详尽系统的概述 这里只介绍几个宏定义这个宏实现了3个功

永彦的专栏 3297

C常用位操作相关宏定义

/* 位操作相关定义 */ /* 1. 获取指定位数掩码 */ #define BITS_MSK_GET(bitsoff, bits) (((0x01 /* 2. 清除指定N BITS */ #define BITS_CLR(var,bitsoff,bits) ((va

luoqiaofa的专栏 1489

从OpenClaw到Hermes Agent:AI Agent实战部署与自动化工作流构建

AI Agent(智能体)作为大语言模型(LLM)的能力延伸,其核心原理在于通过工具调用(Tool Calling)与环境交互,使模型从“对话”走向“执行”。这一技术价值在于将自然语言指令转化为具体操作,实现业务流程自动化,从而提升开发与运维效率。在应用场景上,AI Agent广泛适用于自动化运维、智能客服、数据报告生成等重复性任务处理。本文聚焦于两大热门开源框架OpenClaw与Hermes Agent,深入探讨其部署配置、技能扩展及实战联调。通过结合OpenClaw的模块化扩展能力与Hermes Age

weixin_34122810的博客 503

手把手教你用Wireshark抓包分析BLE广播包:从PDU结构到AD Type实战解析

本文详细介绍了如何使用Wireshark工具抓取并分析BLE广播包,从PDU结构到AD Type的实战解析。通过硬件设备选择、软件配置、协议栈解析及高级故障排查,帮助开发者深入理解蓝牙低功耗通信机制,提升物联网设备调试效率。

weixin_30482383的博客 417

宏定义以及相关面试

1、提高程序的可维护性2、提高程序的可移植性typedef 自定义类型3、减少源程序中重复书写字符串的工作量1、宏名一般用大写字母表示,以示与变量区别。但这并非是规定;2、宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名;3、在宏展开时,预处理程序仅以按宏定义简单替换宏名,而不作任何检查。如果有错误,只能由编译程序在编译宏展开后的源程序时发现;4、宏定义命令#define出现在函数的外部,宏名的有效范围时:从宏定义之后,到本文件结束。

cai88453626的博客 820

一阶电路基础知识

一阶电路(First-order circuit)是指由一个电感(L)或一个电容(C)和一个电阻(R)组成的电路。根据电感或电容的位置,一阶电路可以分为RC电路、RL电路、LC电路、RLC电路。一阶电路常用于滤波、放大、时序控制等各种电子设备和系统中。通过调整电阻、电容或电感的数值,可以改变电路的频率响应、滞后/提前相位等特性,实现不同的功能和性能一阶、二阶电路区别一阶电路由一个电容或一个电感与一个电阻组成,而二阶电路则由两个电容或两个电感与一个电阻组成。

weixin_45365488的博客 1万+

宏定义的相关知识

宏定义\字符串 多行书写时换行 字符串常量定义时的换行问题 如果我们在一行代码的行尾放置一个反斜杠,c语言编译器会忽略行尾的换行符,而把下一行的内容也算作是本行的内容。这里反斜杠起到了续行的作用。 构建较长的字符串是续行的常见用途, 还有一个作用是定义跨行的宏。 如果我们不使用反斜杠,当我们试图初始化一个跨多行的字符串是,c语言编译器就...

dgh18494的博客 160

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6051

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 349

关于keil工程中相关MCU宏定义的问题

此功能猜测可能与keil版本有关,我目前使用keil版本为5.36,工程中切换ARM Compiler为version5,保存后会自动添加(默认选择version6,也会自动添加)。写这篇文章主要由于使用GD芯片遇到问题在向FAE寻求帮助时其反馈工程有问题,在Target C/C++中没有添加相关Define,在向其解释过程中他坚定认为我的工程有问题,所以写个文章记录下,如果有问题还请大家帮忙纠正。上述项目中keil自动添加了相关宏定义只要是正常的我们就无需在手动添加了,添加后虽然不出错但也会重复添加。

xiangyu_0825的博客 505

STM32驱动LED矩阵:IS31FL3731与查理复用技术实践

LED矩阵显示是嵌入式系统中常见的人机交互方式,其核心在于高效的驱动技术。查理复用(Charlieplexing)作为一种创新的矩阵扫描方式,通过引脚复用技术,用N个引脚驱动N²-N个LED,大幅提升了硬件资源利用率。IS31FL3731驱动芯片集成了这一技术,配合STM32F410RB微控制器的强大性能,可实现144个LED的精准控制。这种组合在艺术装置、信息展示等场景中展现出独特优势,既能呈现丰富的视觉效果,又能通过内置PWM调光实现256级亮度控制。通过I2C接口通信,开发者可以轻松实现字符显示、图像

weixin_29193359的博客 279

宏定义相关知识

使用宏定义: 很多人在使用宏定义的时候往往忽略了一些问题 在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。 标准的宏定义: 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法: #define MIN(A,B) ( A 正确做法: #define MIN(A,B) ((A)

xiaoshengyige的专栏 1234

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn‘t retrieve inbound binding

错误消息:错误截图:该错误通常表示在集成配置中,未找到与特定消息匹配的入站绑定(Inbound Binding)。具体而言,错误消息中的 P/S/A(Party/Service/Action)值未在配置中找到对应的入站绑定。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

C语言宏定义相关

博客搬家,原地址:https://langzi989.github.io/2017/06/11/C语言宏定义相关/ C语言宏定义在代码编写中很常见,它常会带来一些很高的性能和很方便的写法,在看Linux源码中sockaddr_in的时候遇到宏定义中##。特地在此记录. 宏定义中##用法 问题背景 Linux中sockaddr_in的定义在文件/netinet/in.h文件中。具体如下: /* St...

langzi989的专栏 408

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++宏定义相关小TIPS

C++宏定义 宏定义是C++编程中一种很常见的语法,有很多使用场景,例如 定义一个通用的常量 定义一个宏函数 实现条件编译 其他 第一种使用场景应该是最多的,一般格式如下: #define PRICE 20 即定义了一个名为PRICE的宏,其值为20。**需要注意的是,宏定义本身对C++编译器并不可见,它只是一条 预处理 指令,在预处理阶段,代码中多有的PRICE都会被替换成20。**所以在一些编程书籍中,是不提倡使用宏定义来定义变量的,因为在编译出错时,报错信息不方便在代码中定位(上例中如果出错,

weixin_42818934的博客 183

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Unity】预编译相关宏定义

Unity包含一个称为Platform Dependent Compilation的功能。这包含一些预处理器指令,可让您对脚本进行分区,以便为受支持的平台之一专门编译和执行一段代码。你可以在Unity编辑器中运行这个代码,这样你就可以专门为你的目标平台编译代码并在编辑器中测试它!

希望有志同道合的的朋友可以互相学习! 1343

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言宏定义相关内容

C语言宏定义相关 前言 C语言所能提供的预处理功能有三种,分别为宏定义、文件包含和条件编译。预处理命令可以改变程序设计环境,提高编程效率, 它们并不是C 语言本身的组成部分, 不能直接对它们进行编译, 必须在对程序进行编译之前, 先对程序中这些特殊的命令进行“预处理” 。经过预处理后, 就将预处理命令转换为实际代码(会将注释代码去掉), 最后再由编译程序对预处理之后的源程序进行编译处理, 得到可供执行的目标代码。 一: 宏定义语法与优缺点 1.1 基本语法 #define命令是C语言中的一个宏定义命令,它用

lllhhh0220的博客 419

宏定义的相关笔记

1.格式 #define 宏名 字符串//字符串如果是表达式,一定要用括号全括起来,以免出错 //其他格式,和平常一样 比如: #include<stdio.h> #include<math.h> #define S(a,b,c) ((a+b+c)/2) void main() { int a, b, c,s; printf("请输入三边长:"); scanf_s("%d %d %d",&a,&b,&c); s = S(a, b, c); prin

qq_43867963的博客 344

宏定义相关技巧

写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事 least = MIN(*p++, b);   解答: #define MIN(A,B) ((A) <= (B) ? (A) : (B))   MIN(*p++, b)会

曹绍坚(嵌入式学生) 1605
上一篇: 程序的内存分配问题(堆栈分配)
easecom
博客等级 码龄19年 11粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值