gpt4 book ai didi

c - 替换许多字符串常量的宏

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:05 25 4
gpt4 key购买 nike

我有几个相机对象的标签,我正在努力节省内存(非常吝啬的内存环境)。这是我当前的版本,使用静态常量数组和宏:

在标题中:

#define NUM_CAMERAS         6        
static const char* CAM_LABELS[NUM_CAMERAS] = { "Camera1",
"Camera2",
"Camera3",
"752x480_cam",
"std_cam",
"wide_cam" };
#define CAM_LABEL(id) id<=NUM_CAMERAS?CAM_LABELS[id-1]:"cam id error"

程序中的用法:

int cam = 3;     
pritnf("Configuring camera id [%d], label: [%s]\n",cam, CAM_LABEL(cam) );

上面的工作,但我想用宏来替换静态常量数组,所以我会在标题中有一些更像:

#define NUM_CAMERAS       6
#define CAM_LABEL1 "Camera1"
#define CAM_LABEL2 "Camera2"
#define CAM_LABEL3 "Camera3"
#define CAM_LABEL4 "752x480_cam"
#define CAM_LABEL5 "std_cam"
#define CAM_LABEL6 "wide_cam"
#define CAM_LABEL(id) /* myster code */

有没有办法将整数值作为上面的“id”传递,然后重新创建一个已知的 CAM_LABEL## 值?我尝试了 ## 粘合宏的几种组合,但它会放入“cam”或传递给宏的任何变量名称,而不是该变量值。我可能错过了一些非常明显的东西。

提前致谢。

最佳答案

不确定我是否理解你的问题,但这对我来说非常有效:

#include <stdio.h> 

#define CAM_LABEL1 "Camera1"
#define CAM_LABEL2 "Camera2"
#define CAM_LABEL3 "Camera3"
#define CAM_LABEL4 "752x480_cam"
#define CAM_LABEL5 "std_cam"
#define CAM_LABEL6 "wide_cam"

#define CAM(n) CAM_LABEL##n

int main(int argc, const char *argv[])
{
printf("CAM: [%s], [%s]\n",CAM(2),CAM(3));
}

但是,我认为这不会有效地节省内存(这似乎是您主要关心的问题)。您指望编译器将折叠相同的常量字符串,以便“Camera1”的每个实例都被相同的指针替换(并且字符串本身仅存储一次)。这不能保证;在:

printf("%s, %s\n","Camera1","Camera1");

编译器创建两个分离字符串是合法的。

我建议您创建一个字符串和一个偏移 vector :

const char *cam_labels="Camera1\0Camera2\0Camera3";
const char *cam_labels_offset = "\x00\x08\x10";

#define CAM(x) (cam_labels+cam_labels_offset[x])
int main(int argc, const char *argv[])
{
printf("CAM: [%s], [%s]\n",CAM(0),CAM(2));
}

你应该添加一些控制以避免讨厌的事情发生(但要冒双重评估的风险),如果字符串的总长度超过 255,你将需要用两个字节表示偏移量。

您还应该编写一个小例程来获取偏移量,手工计算它们太容易出错。

设 p 是您系统中 a (char *) 的大小,n 是标签的数量,s 是字符串长度的总和(包括结尾的\0)。

您的第一种方法(带有指向字符串的指针数组的方法)将需要 n*p+s 字节来存储,您的第二种方法(使用宏)实际上取决于编译器,我建议的方法需要 2p+s +n.

关于c - 替换许多字符串常量的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920402/

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