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:30:14: 错误:'COMM_STR_BUF_LEN' 未在此处声明(不在函数中)
第二种情况:在原型中使用COMM_STR_BUF_LEN
在另一个文件中,我的 header:
中有这个原型
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
中,注意header被flexsea.h
包含,上面的点COMM_STR_BUF_LEN
宏已定义。因此,flexsea_comm.h
将始终在定义该宏之前处理,除非它在 flexsea.h
.
之前单独 #include
d
这同样可能适用于您的函数原型,假设它也出现在 flexsea.h
包含的 header 之一中。
最简单且破坏性最小的解决方案可能是将宏定义移动到 flexsea.h
的 top,就在保护宏之后。
我在不同文件中使用定义的值时遇到问题。我有一个名为 "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:30:14: 错误:'COMM_STR_BUF_LEN' 未在此处声明(不在函数中)
第二种情况:在原型中使用COMM_STR_BUF_LEN
在另一个文件中,我的 header:
中有这个原型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
中,注意header被flexsea.h
包含,上面的点COMM_STR_BUF_LEN
宏已定义。因此,flexsea_comm.h
将始终在定义该宏之前处理,除非它在 flexsea.h
.
#include
d
这同样可能适用于您的函数原型,假设它也出现在 flexsea.h
包含的 header 之一中。
最简单且破坏性最小的解决方案可能是将宏定义移动到 flexsea.h
的 top,就在保护宏之后。