#define _INTSIZEOF(n)

将某个数按int内存对齐:

#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

 

数学解释:

对于两个正整数 x, n 总存在整数 q, r 使得

x = nq + r, 其中  0<= r <n                  //最小非负剩余

q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.


所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 这也相当于把 x 表示为:

x = nq + r', 其中 -n < r' <=0                //最大非正剩余   

nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:

x+n = qn + (n+r'),其中 0<n+r'<=n            //最大正剩余

x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n    //最小非负剩余

所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:

((x+n-1)/n)*n

若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:

(x+n-1) & (~(n-1))

#ifndef _SMARTLINK_TYPEDEF_H_ #define _SMARTLINK_TYPEDEF_H_ #endif #include "lib/tppacket.h" //#define DBG_MAJOR(fmt, args...) do{printf("[DBG_MAJOR=====] func %s,line %d: "fmt"\n",__FUNCTION__,__LINE__,##args);}while(0); //#define DBG_ERR(fmt, args...) do{printf("[DBG_ERR=====] func %s,line %d: "fmt"\n",__FUNCTION__,__LINE__,##args);}while(0); //#define DBG(fmt, args...) do{printf("[DBG=====] func %s,line %d: "fmt"\n",__FUNCTION__,__LINE__,##args);}while(0); #define DBG_MAJOR #define DBG_ERR #define DBG #define SMARTLINK_UP_IDX_RANGE (8 + 96) #define PAL_MQ_WAIT_FOREVER (-1) #define TPIMI_REGISTER_COMMAND(funcName) imi_function_register(IMI_TYPE_SMARTLINK, #funcName, (funcName)) #define PFM_IF_FAIL_RET_VAL(expression, ret) \ do{\ if ( OK != expression ){\ return ret;\ }\ }while(0) #define PFM_IF_FAIL_RET(expression) \ do{\ int __rv;\ __rv = (expression);\ if ( OK != __rv ){\ return __rv;\ }\ }while(0) #define PFM_ENSURE_RET_VOID(exp) \ do{\ if (!(exp)){\ DBG_ERR("Ensure %s failed.", #exp);\ return;\ }\ }while(0) /* goto done */ #define PFM_IF_FAIL_DONE(ret, expression) \ do{\ ret = (expression);\ if ( OK != ret ){\ DBG_ERR("E - %d call %s failed.",ret,#expression);\ goto done;\ }\ }while(0) #define FLUSH_TYPE_SEND 0x01 #define FLUSH_TYPE_RSP 0x02 #define MAC_LENGTH 6 #define PORT_LENGTH 2 #define FLASH_TABLE_LENGTH 512 #define MAX_SMARTLINK_GROUP 8 #define PORT_SLAVE 0 #define PORT_MASTER (1) #define NODE_ID_LEN (6) #define SMARTLINK_MAX_PKT_LEN (64) //目前只需要64字节即可,后续如果有改动则再另外加 #define MAX_PORT_PER_RING (2) #define MAX_SMARTLINK_RING (getSmartlinkRingMaxNum()) //ringId从1 开始 #define SMARTLINK_RING_RUNNING_LIMIT (32) // 最多同时运行32个环 #define SMARTLINK_STACK_SIZE (4*8192) #define SMARTLINK_QUEUE_SIZE (256) #define SMARTLINK_MAX_INSTANCE (getMstpInstanceMaxNum()) #define FAILED (1) #define NON_FAILED (0) #define NO_ACTION #define G_P groupId,port #define SMARTLINK_PKT_FS (1<<0) #define SMARTLINK_PKT_EVT (1<<1) #define SMARTLINK_PKT_SF (1<<2) #define SMARTLINK_PKT_MS (1<<3) #define SMARTLINK_PKT_NR (1<<4) #define SMARTLINK_PKT_RB (1<<5) #define SMARTLINK_PKT_DNF (1<<6) //dnf #define SMARTLINK_PKT_BPR (1<<7) //用于说明端口是否为右端口 #define SMARTLINK_BRP_OFFSET (7) #define SMARTLINK_MAX_UTF8_LEN (3) #define SMARTLINK_DES_LEN (16* SMARTLINK_MAX_UTF8_LEN) #define SMARTLINK_DEFAULT_VER (1) #define SMARTLINK_DEFAULT_HOLD (0) #define SMARTLINK_DEFAULT_WTB (7) #define SMARTLINK_DEFAULT_WTR (5) #define SMARTLINK_DEFAULT_GUARD (200) #define SMARTLINK_DEFAULT_MEL (7) #define SMARTLINK_DEFAULT_GUARD_TIME (200) #define SMARTLINK_MAX_GUARD_TIME (200) #define SMARTLINK_MIN_GUARD_TIME (1) #define SMARTLINK_DEFAULT_HOLD_TIME (0) #define SMARTLINK_MAX_HOLD_TIME (100) #define SMARTLINK_MIN_HOLD_TIME (0) #define SMARTLINK_DEFAULT_WTR_TIME (5) #define SMARTLINK_MAX_WTR_TIME (12) #define SMARTLINK_MIN_WTR_TIME (1) #define SMARTLINK_DEFAULT_TC_INTERVAL (2) #define SMARTLINK_MAX_TC_INTERVAL (600) #define SMARTLINK_MIN_TC_INTERVAL (1) #define SMARTLINK_DEFAULT_TC_THRESHOLD (3) #define SMARTLINK_MAX_TC_THRESHOLD (255) #define SMARTLINK_MIN_TC_THRESHOLD (1) #define SMARTLINK_DEFAULT_VC (0) #define RING_ID_VALID(id) (id >= 1 || id <= MAX_SMARTLINK_RING) #define SMARTLINK_ID_ITER(id) for (id = 1; id <= MAX_SMARTLINK_RING; id++) #define SMARTLINK_MAX_ID_LEN (256/8) #define SMARTLINK_ID_BIT_HIT(b, d) do{d[((b) / 8)] |= (1<<((b)%8));}while(0) #define SMARTLINK_ID_BIT_CLR(b, d) do{d[((b) / 8)] &= ~(1<<((b)%8));}while(0) #define SMARTLINK_ID_BIT_HAS_ID(b, d) ((d[b/8] & (1<<(b%8))) != 0) #define SMARTLINK_ID_BIT_ITEM(id, d) \ SMARTLINK_ID_ITER(id)\ if(SMARTLINK_ID_BIT_HAS_ID(id, d)) #ifndef SMARTLINK_TRAP_PROTECT #define SMARTLINK_TRAP_PROTECT #endif // smlk状态机状态数据结构 typedef enum { SMARTLINK_DEFAULT, SMARTLINK_UNINIT, SMARTLINK_SLAVE, SMARTLINK_DOWN, SMARTLINK_BACK_TIME, SMARTLINK_MAX_STATUS }SMARTLINK_STATUS; // msg类型 typedef enum { SMARTLINK_MSG_PACKET, SMARTLINK_STATE_DEFAULT, SMARTLINK_MASTER_PORT_UP, SMARTLINK_SLAVE_PORT_UP, SMARTLINK_MASTER_PORT_DOWN, SMARTLINK_SLAVE_PORT_DOWN, SMARTLINK_FAIL_BACK, SMARTLINK_MSG_END }SMARTLINK_MSG_TYPE; /* Smart Link组配置数据结构 */ typedef struct uc_smartlink_t { int groupId; // 组号 int enabled; // 是否启用此实例 int instanceId; // [KEY] 实例ID (1~10) int masterPort; // 主端口编号(如10表示GE1/0/10) int slavePort; // 备用端口编号 int failBack; // 抢占模式:0-关闭,1-开启 int failBackTime; // 抢占延迟时间(秒),典型值为30 int ctrlVlan; // 控制VLAN }SMARTLINK_CFG_T; typedef struct uc_smart_link_Glb_t { int enable; int flush_send; int flush_receive; int rcv_vlan[MAX_SMARTLINK_GROUP+1];/* 初始或空vlan为 -1*/ }SMARTLINK_Glb_CFG_T; // typedef struct erps_msg // { // SMARTLINK_MSG_TYPE type; // TP_PACKET_T packet; // int groupId; // int port; // user_port up; // }SMARTLINK_MSG; typedef struct smart_link_srvc_msg_s { SMARTLINK_MSG_TYPE type; // TP_PACKET_T packet; SMARTLINK_CFG_T cfg; }SMARTLINK_SRVC_MSG_T; // smlk线程间消息队列数据结构 typedef struct smartLink_msg { SMARTLINK_MSG_TYPE type; TP_PACKET_T packet; SMARTLINK_CFG_T cfg; user_port up; }SMARTLINK_MSG; typedef enum { SMARTLINK_GROUP_NONE, SMARTLINK_GROUP_MASTER, SMARTLINK_GROUP_SLAVE, }SMARTLINK_ROLE; typedef struct smartlink_packet_data { UINT8 destMAC[MAC_LENGTH]; UINT8 srcMAC[MAC_LENGTH]; UINT8 ctrlType; UINT8 ctrlVersion; UINT8 SWID[MAC_LENGTH]; UINT16 ctrlVlan; UINT8 authMode; UINT8 passWord[16]; char map[FLASH_TABLE_LENGTH]; UINT8 FCS[4]; }SMARTLINK_PACKET_DATA; typedef struct rtd_smart_link_t { /* groupid == -1 表示为创建group */ int groupid; SMARTLINK_STATUS status; SMARTLINK_CFG_T cfg; }RTD_SMARTLINK_T; typedef struct smartLink_flush_table { char table[FLASH_TABLE_LENGTH]; }SMARTLINK_MAC_PORT;
最新发布
10-14
你提供的头文件 `smartLinkType.h`(或类似名称)中存在一个 **关键错误**:**枚举 `SMARTLINK_DEFAULT` 被重复定义了**,这正是你在编译时看到如下错误的原因: ``` ../include/smartLink/smartLinkType.h:145: error: redeclaration of enumerator 'SMARTLINK_DEFAULT' ../include/smartLink/smartLinkType.h:145: error: previous definition of 'SMARTLINK_DEFAULT' was here ``` --- ### ✅ 问题分析 在你的代码中,有两个地方定义了名为 `SMARTLINK_DEFAULT` 的标识符: #### 1. 宏定义: ```c #define SMARTLINK_DEFAULT_VER (1) // ... 其他类似 ... #define SMARTLINK_DEFAULT // ← 注意这一行! ``` > ⚠️ 这一行虽然没有赋值,但已经将 `SMARTLINK_DEFAULT` 定义为一个空宏。 #### 2. 枚举成员: ```c typedef enum { SMARTLINK_DEFAULT, SMARTLINK_UNINIT, SMARTLINK_SLAVE, SMARTLINK_DOWN, SMARTLINK_BACK_TIME, SMARTLINK_MAX_STATUS } SMARTLINK_STATUS; ``` 当预处理器处理这段代码时,会把 `SMARTLINK_DEFAULT` 替换为空(因为前面被 `#define SMARTLINK_DEFAULT` 空宏定义),变成: ```c typedef enum { , // ← 这里变成了一个空的枚举项,语法错误! SMARTLINK_UNINIT, ... } ``` 这会导致两个后果: - 编译器认为第一个枚举项“缺失”,可能跳过并继续。 - 更严重的是,由于宏替换后不再是合法标识符,后续解析出错,并报“redeclaration”——本质是语法混乱导致的误判。 但更常见的情况是:即使不引起语法错误,**宏名和枚举值同名也会造成逻辑冲突与不可预测行为**。 --- ### ✅ 正确解决方案 #### ✅ 修复步骤: 1. **删除或重命名空宏 `#define SMARTLINK_DEFAULT`** - 它没有任何作用(既不打印也不参与逻辑),且极易引发命名冲突。 - 如果它是用于调试开关,请使用更有意义的名字,如 `ENABLE_SMARTLINK_DEBUG`。 2. **确保所有宏、枚举、常量名称唯一,避免混淆** --- ### ✅ 修复后的代码示例(C语言) ```c #ifndef _SMARTLINK_TYPEDEF_H_ #define _SMARTLINK_TYPEDEF_H_ #include "lib/tppacket.h" #ifdef __cplusplus extern "C" { #endif // 删除有问题的 #define SMARTLINK_DEFAULT // #define SMARTLINK_DEFAULT ← 已移除! // 可选:如果你真想保留“默认”标志,改用其他名字 #define SMARTLINK_DEFAULT_VERSION (1) #define SMARTLINK_DEFAULT_HOLD_TIME (0) #define SMARTLINK_DEFAULT_WTB (7) #define SMARTLINK_DEFAULT_WTR (5) #define SMARTLINK_DEFAULT_GUARD (200) #define SMARTLINK_DEFAULT_MEL (7) // 其他宏保持不变... #define FLUSH_TYPE_SEND (0x01) #define FLUSH_TYPE_RSP (0x02) #define MAC_LENGTH (6) #define PORT_LENGTH (2) #define FLASH_TABLE_LENGTH (512) #define MAX_SMARTLINK_GROUP (8) #define PORT_SLAVE (0) #define PORT_MASTER (1) #define NODE_ID_LEN (6) #define SMARTLINK_MAX_PKT_LEN (64) #define MAX_PORT_PER_RING (2) #define MAX_SMARTLINK_RING (getSmartlinkRingMaxNum()) #define SMARTLINK_RING_RUNNING_LIMIT (32) #define SMARTLINK_STACK_SIZE (4*8192) #define SMARTLINK_QUEUE_SIZE (256) #define SMARTLINK_MAX_INSTANCE (getMstpInstanceMaxNum()) #define FAILED (1) #define NON_FAILED (0) #define NO_ACTION /* no action */ #define G_P groupId, port // 包类型标志位 #define SMARTLINK_PKT_FS (1<<0) #define SMARTLINK_PKT_EVT (1<<1) #define SMARTLINK_PKT_SF (1<<2) #define SMARTLINK_PKT_MS (1<<3) #define SMARTLINK_PKT_NR (1<<4) #define SMARTLINK_PKT_RB (1<<5) #define SMARTLINK_PKT_DNF (1<<6) // dnf #define SMARTLINK_PKT_BPR (1<<7) // 右端口标志 #define SMARTLINK_BRP_OFFSET (7) #define SMARTLINK_MAX_UTF8_LEN (3) #define SMARTLINK_DES_LEN (16 * SMARTLINK_MAX_UTF8_LEN) // 时间参数 #define SMARTLINK_DEFAULT_TC_INTERVAL (2) #define SMARTLINK_MAX_TC_INTERVAL (600) #define SMARTLINK_MIN_TC_INTERVAL (1) #define SMARTLINK_DEFAULT_TC_THRESHOLD (3) #define SMARTLINK_MAX_TC_THRESHOLD (255) #define SMARTLINK_MIN_TC_THRESHOLD (1) #define SMARTLINK_DEFAULT_VC (0) // 实用宏 #define RING_ID_VALID(id) ((id) >= 1 && (id) <= MAX_SMARTLINK_RING) // 原条件写错了 || → && #define SMARTLINK_ID_ITER(id) for ((id) = 1; (id) <= MAX_SMARTLINK_RING; (id)++) #define SMARTLINK_ID_BIT_HIT(b, d) do { (d)[((b)/8)] |= (1<<((b)%8)); } while(0) #define SMARTLINK_ID_BIT_CLR(b, d) do { (d)[((b)/8)] &= ~(1<<((b)%8)); } while(0) #define SMARTLINK_ID_BIT_HAS_ID(b, d) (((d)[(b)/8] & (1<<((b)%8))) != 0) #define SMARTLINK_ID_BIT_ITEM(id, d) \ SMARTLINK_ID_ITER(id) \ if(SMARTLINK_ID_BIT_HAS_ID(id, d)) #ifndef SMARTLINK_TRAP_PROTECT #define SMARTLINK_TRAP_PROTECT #endif // smlk状态机状态 typedef enum { SMARTLINK_DEFAULT, // ← 现在安全了!不会被宏替换 SMARTLINK_UNINIT, SMARTLINK_SLAVE, SMARTLINK_DOWN, SMARTLINK_BACK_TIME, SMARTLINK_MAX_STATUS } SMARTLINK_STATUS; // 消息类型 typedef enum { SMARTLINK_MSG_PACKET, SMARTLINK_STATE_DEFAULT, SMARTLINK_MASTER_PORT_UP, SMARTLINK_SLAVE_PORT_UP, SMARTLINK_MASTER_PORT_DOWN, SMARTLINK_SLAVE_PORT_DOWN, SMARTLINK_FAIL_BACK, SMARTLINK_MSG_END } SMARTLINK_MSG_TYPE; // Smart Link组配置结构 typedef struct uc_smartlink_t { int groupId; // 组号 int enabled; // 是否启用此实例 int instanceId; // [KEY] 实例ID (1~10) int masterPort; // 主端口编号 int slavePort; // 备用端口编号 int failBack; // 抢占模式:0-关闭,1-开启 int failBackTime; // 抢占延迟时间(秒) int ctrlVlan; // 控制VLAN } SMARTLINK_CFG_T; typedef struct uc_smart_link_Glb_t { int enable; int flush_send; int flush_receive; int rcv_vlan[MAX_SMARTLINK_GROUP + 1]; /* 初始或空vlan为 -1 */ } SMARTLINK_Glb_CFG_T; typedef struct smart_link_srvc_msg_s { SMARTLINK_MSG_TYPE type; SMARTLINK_CFG_T cfg; } SMARTLINK_SRVC_MSG_T; typedef struct smartLink_msg { SMARTLINK_MSG_TYPE type; TP_PACKET_T packet; SMARTLINK_CFG_T cfg; user_port up; } SMARTLINK_MSG; // 角色枚举 typedef enum { SMARTLINK_GROUP_NONE, SMARTLINK_GROUP_MASTER, SMARTLINK_GROUP_SLAVE, } SMARTLINK_ROLE; // 数据包结构 typedef struct smartlink_packet_data { UINT8 destMAC[MAC_LENGTH]; UINT8 srcMAC[MAC_LENGTH]; UINT8 ctrlType; UINT8 ctrlVersion; UINT8 SWID[MAC_LENGTH]; UINT16 ctrlVlan; UINT8 authMode; UINT8 passWord[16]; char map[FLASH_TABLE_LENGTH]; UINT8 FCS[4]; } SMARTLINK_PACKET_DATA; typedef struct rtd_smart_link_t { int groupid; // groupid == -1 表示未创建 SMARTLINK_STATUS status; SMARTLINK_CFG_T cfg; } RTD_SMARTLINK_T; typedef struct smartLink_flush_table { char table[FLASH_TABLE_LENGTH]; } SMARTLINK_MAC_PORT; #ifdef __cplusplus } #endif #endif /* _SMARTLINK_TYPEDEF_H_ */ ``` --- ### 🔍 关键修改点总结: | 修改项 | 说明 | |-------|------| | ❌ `#define SMARTLINK_DEFAULT` | 删除!这是罪魁祸首 | | ✅ `RING_ID_VALID(id)` | 将 `||` 改为 `&&`,原逻辑错误 | | ✅ 添加 `#ifdef __cplusplus` 外部链接保护 | 提高 C++ 兼容性 | | ✅ 所有宏加括号 `( )` | 防止宏展开副作用 | | ✅ 使用统一命名风格 | 如 `SMARTLINK_DEFAULT_X` 表示默认值 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值