在C

时间:2018-03-16 18:06:42

标签: c string macros

对于带有USB海量存储的嵌入式系统(带有ST的usbd_msc库的STM32),我需要在宽字符数组中定义一串长度为前缀的字符串(每个字符2个字节)。

要发送到较低层的字符串标识符定义如下:

#define USB_INT_STR      "MSC_Interface"

目前,ST提供的应用示例使用formating function到静态缓冲区。

由于这些非标准字符串是完整的,我想让它们编译时定义宽字符数组,例如:

const wchar_t USB_INT_STR_pre[] = {sizeof(USB_INT_STR)*2 , 'M','S','C','_','I','n','t','e','r','f','a','c','e','\0'};

这样我可以保存最多0x100字节的RAM,就像在库中一样,在回调中使用静态缓冲区将常规字符串格式化为长度为前缀的宽字符串字符串。

是否有任何宏大师知道如何使用宏将其放下,而不会手动将所有字符串拆分为wchar_t数组?

对于技术娴熟,这里是源:usbd_desc.c source code,其中调用USBD_GetString(),在USBD_StrDesc []静态缓冲区中以unicode格式化字符串。

编辑:我不认为有一个解决方案,宏观方面,我最终会手动将字符串定义为:

#define USBD_INTERFACE_FS_STRING      "MSC_Interface"
const uint16_t  USBD_INTERFACE_FS_STRING_UNICODE[] = {(sizeof(USBD_INTERFACE_FS_STRING) * 2 + (USB_DESC_TYPE_STRING << 8)), 'M', 'S', 'C', '_', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e'};

1 个答案:

答案 0 :(得分:0)

我不认为预处理器宏可以实现这一点。预处理器可以连接令牌,但字符串文字只是另一个令牌,预处理器不知道它的大小或元素。我看到两个只有预处理程序的选项:

  • 传递长度和字符串文字,预处理器可以创建一个包含长度的1个字符的字符串:类似于L"\x001C" L"MSC_Interface"的东西。这需要传递长度,因为sizeof在预处理器时间不可用。但是,我猜测你在这里尝试实现的一件事就是推断长度。
  • 将字符串指定为逗号分隔字符。宏生成类似{ sizeof(wchar_t)*sizeof({'M','S','C','_','I','n','t','e','r','f','a','c','e','\0'}), 'M','S','C','_','I','n','t','e','r','f','a','c','e','\0'}的内容。 sizeof函数保留在预处理代码中,稍后在编译中由编译器进行评估。然而,这看起来并不完美,可能会让新的代码库感到困惑。

因此,我怀疑,实现你的目标也不会。

我在评论中询问了C ++,因为有一个文件编译为C ++,你可以在编译时这样做,它可以被你的C代码库的其余部分使用。否则,我认为您将被限制为手动插入或生成定义描述符的文件以自动化该过程