我有几个相机对象的标签,我正在尝试节省内存(非常吝啬的内存环境)。这是我当前的版本,使用静态常量数组和宏:
在标题中:
#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) );
上面的工作,但我想用宏来替换静态const数组,所以我会在标题中有更多的东西:
#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”或任何变量名称传递给宏,而不是那个变量值。我可能错过了一些非常明显的事情。
提前致谢。
答案 0 :(得分:4)
不确定我是否理解你的问题,但这对我来说非常有用:
#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");
编译器创建两个特殊字符串是合法的。
我建议你创建一个字符串和一个偏移量矢量:
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是系统中(char *)的大小,n是标签的数量,s是字符串长度的总和(包括结尾\ 0)。
你的第一种方法(带字符串指针的那个)将需要n * p + s字节来存储,你的第二种方法(用宏)真的取决于编译器,我建议需要2p + s + N