繁体   English   中英

C:在函数原型或结构声明中使用#define值时遇到麻烦

[英]C: trouble using a #define value in a function prototype, or inside a structure declaration

我在其他文件中使用定义的值时遇到麻烦。 我有一个名为“ flexsea.h”的文件,其中包含整个项目的定义(例如#define COMM_STR_BUF_LEN 48)。 我项目中的大多数文件都包含flexsea.h,我可以使用COMM_STR_BUF_LEN。 有两种情况给我带来麻烦。

flexsea.h的第一部分:

//****************************************************************************
// flexsea: Master file for the FlexSEA stack.
//****************************************************************************

#ifndef INC_FLEXSEA_H_
#define INC_FLEXSEA_H_

//****************************************************************************
// Include(s)
//****************************************************************************

#include <stdint.h> 
#include <stdarg.h>

//All the FlexSEA stack includes:
#include "flexsea_buffers.h"
#include "flexsea_comm.h"
#include "flexsea_payload.h"
#include "flexsea_rx_cmd.h"
#include "flexsea_tx_cmd.h"
#include "flexsea_cmd_comm.h"
#include "flexsea_cmd_control.h"
#include "flexsea_cmd_data.h"
#include "flexsea_cmd_external.h"
#include "flexsea_cmd_sensors.h"
#include "flexsea_cmd_system.h"
#include "flexsea_cmd_user.h"

//****************************************************************************
// Prototype(s):
//****************************************************************************

unsigned int flexsea_error(unsigned int err_code);
void uint32_to_bytes(uint32_t x, uint8_t *b0, uint8_t *b1, uint8_t *b2, uint8_t *b3);
void uint16_to_bytes(uint32_t x, uint8_t *b0, uint8_t *b1);
void fill_uint8_buf(uint8_t *buf, uint32_t len, uint8_t filler);

//****************************************************************************
// Definition(s):
//****************************************************************************

//Buffers and packets:
#define RX_BUF_LEN                      64      //Reception buffer (flexsea_comm)
#define PAYLOAD_BUF_LEN                 24      //Number of bytes in a payload string
#define PAYLOAD_BYTES                   (PAYLOAD_BUF_LEN - 4)
#define COMM_STR_BUF_LEN                48      //Number of bytes in a comm. string
#define PACKAGED_PAYLOAD_LEN            48      //Temporary
#define PAYLOAD_BUFFERS                 4       //Max # of payload strings we expect to find

第一种情况:在结构中使用COMM_STR_BUF_LEN

#ifndef INC_FX_COMM_H
#define INC_FX_COMM_H

//****************************************************************************
// Include(s)
//****************************************************************************

#include "flexsea.h"

//****************************************************************************
// Local variable(s)
//****************************************************************************

//****************************************************************************
// Structure(s):
//****************************************************************************

struct sc_data_s
{
     uint8_t flag;                              //1 when new data ready to be transmitted
     uint8_t str[48];                         //Data to be transmitted     //ToDo Should be COMM_STR_BUF_LEN!
     uint8_t length;                              //Number of bytes to be sent
     uint8_t cmd;                              //What's the command? (used to know if we will get an answer)
     uint8_t listen;                              //1 when we expect an answer
};

...
#endif

str [48]应该为str [COMM_STR_BUF_LEN],但GCC告诉我它未声明。 如果我不在结构中使用它,则可以#define TEST COMM_STR_BUF_LEN并编译文件。

编译代码示例:

struct sc_data_s
{
     uint8_t flag;
     uint8_t str[48];
     uint8_t length;
     uint8_t cmd;
     uint8_t listen;
};

这也很好:

#define LEN 48
struct sc_data_s
{
     uint8_t flag;
     uint8_t str[LEN];
     uint8_t length;
     uint8_t cmd;
     uint8_t listen;
};  

但是,这不起作用:

struct sc_data_s
{
     uint8_t flag;
     uint8_t str[COMM_STR_BUF_LEN];
     uint8_t length;
     uint8_t cmd;
     uint8_t listen;
};  

错误消息: ./ inc /../../ common / inc / flexsea_comm.h:3014:错误:此处未声明“ COMM_STR_BUF_LEN”(不在函数中)

第二种情况:在原型中使用COMM_STR_BUF_LEN

在另一个文件中,我的标头中包含以下原型:

void clear_rx_command(uint8_t x, uint8_t y, uint8_t rx_cmd[][PACKAGED_PAYLOAD_LEN]);

无法使用PACKAGED_PAYLOAD_LEN进行编译,必须对值进行硬编码。 对于该用例,我将原型移至.c,因为它是私有函数,但我想知道下一次如何做。

我的两个问题相似,因此我怀疑存在根本的误解。 我究竟做错了什么?

谢谢!

杰夫

假设在保护宏INC_FX_COMM_H指示以下的代码是在文件flexsea_comm.h ,请注意,该头是由包含flexsea.h ,上述的地步COMM_STR_BUF_LEN宏定义。 其结果是, flexsea_comm.h将始终之前宏被定义,除非它是处理#include单独D,前flexsea.h

假定它也出现在flexsea.h包含的头文件之一中,这可能也适用于您的函数原型。

最简单,破坏性最小的解决方案可能是将宏定义移到保护宏之后的flexsea.h顶部

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM