gpt4 book ai didi

c++ - 有没有办法修改这个 C++ 结构赋值 block 以直接在 C 中工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:27 24 4
gpt4 key购买 nike

以下代码驻留在设备中,当通过 IrDA 套接字连接枚举时,该设备将发出 deviceId (LXdeviceInfo)。这只是为了解释为什么我想保持数据类型尽可能相似,但能够使用 ansi C 编译

对于 windows.h 和 af_irda.h 的#includes,以下代码在 C++ 编译器中编译时没有错误,但在 C 编译器中会在结构赋值下方中断(请参阅此处的错误)。理想情况下,我想将结构成员 'ID' 初始化为一个字符数组,同时保持它在原始代码中的类型,这样我就可以像它出现的那样测试 LXdeviceInfo 的值当从 PC 套接字连接调用设备时查询它。

有什么方法可以修改这个赋值 block 以直接在 C 中工作吗?

#include <windows.h>
#include <af_irda.h>

#define IR_HINT_COMPUTER 0x04
#define IR_HINT_EXT 0x80
#define IR_HINT_OBEX 0x20
#define IR_HINT_IRCOMM 0x04
#define IR_CHAR_ASCII 0
#define PROD_FAMILY_NAME ("product name goes here")

#define uint8_t unsigned char

const struct {
uint8_t hint1;
uint8_t hint2;
uint8_t charset;
uint8_t ID[sizeof(PROD_FAMILY_NAME)];
} devInfoStorage =
{
IR_HINT_COMPUTER | IR_HINT_EXT, // hint1
IR_HINT_OBEX | IR_HINT_IRCOMM, // hint2
IR_CHAR_ASCII, // charset
PROD_FAMILY_NAME // Prod ID string
}; // ERROR here: Innvalid initialization type: found 'pointer to char' expected 'unsigned char'

const uint8_t *LXdeviceInfo = (uint8_t *) &devInfoStorage;

/* The size of the device info */
const uint8_t LXdeviceInfoLen = sizeof(devInfoStorage);



void main(void)
{

#define DEVICE_LIST_LEN 10

unsigned char DevListBuff[sizeof (DEVICELIST) -
sizeof (IRDA_DEVICE_INFO) +
(sizeof (IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];

int DevListLen = sizeof (DevListBuff);
PDEVICELIST pDevList;

pDevList = (PDEVICELIST) & DevListBuff;
//code continues.

}

最佳答案

删除字符串文字周围的括号。括号使宏扩展为一个表达式,该表达式将衰减为指针类型,这使得它无法在您的 C 编译器中编译。指针类型不能用于初始化数组。没有括号,字符串文字用于初始化数组。

#define PROD_FAMILY_NAME "product name goes here"

C 标准规定带括号的表达式采用与未带括号的表达式相同的类型,C.99 §6.5.1 ¶5:

A parenthesized expression is a primary expression. Its type and value are identical to those of the unparenthesized expression. It is an lvalue, a function designator, or a void expression if the unparenthesized expression is, respectively, an lvalue, a function designator, or a void expression.

然而,虽然字符串文字是一个表达式,但反之则不然。具体来说,字符串文字本身不是类型,而是定义的实体。数组的初始化允许使用字符串文字,C.99 §6.7.8 ¶14:

An array of character type may be initialized by a character string literal, optionally enclosed in braces.

其他允许的数组初始化器在 C.99 §6.7.8 ¶16 中描述:

Otherwise, the initializer for an object that has aggregate or union type shall be a brace enclosed list of initializers for the elements or named members.

带括号的表达式不是字符串文字,也不是用大括号括起来的初始化列表。

关于c++ - 有没有办法修改这个 C++ 结构赋值 block 以直接在 C 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com