背景:
我决定在我的程序中使用中立的void指针(void*),因为它是统一的,高效的,我可以将它们转换为上下文中需要的任何内容。
当调用比较函数时,所有的参数/参数都必须作为空指针传递,例如:
compare_integer_equal((void*) &r, p12, (void*) NUMBER_1_INTEGER_STATE_CYBOI_MODEL);
整数常量全局定义为:
static int NUMBER_1_INTEGER_STATE_CYBOI_MODEL_ARRAY[] = { 1 };
static int* NUMBER_1_INTEGER_STATE_CYBOI_MODEL = NUMBER_1_INTEGER_STATE_CYBOI_MODEL_ARRAY;
问题:
这样的常量确实存在于所有经常使用的数字中,并且总计超过2 MB的文件大小,我想消除这一点。当然,我总是可以使用这样的局部变量:
int i = 1;
compare_integer_equal((void*) &r, p12, (void*) &i);
但我想避免这种额外的努力/内存/时间时,必须做数百次比较。当试图从一个字面量的引用,如下面的例子所示,编译器产生的错误:“需要左值作为一元'&'操作数”:
compare_integer_equal((void*) &r, p12, (void*) &1);
有没有一种方法可以从一个字面值得到一个内存地址(指针)?有没有其他的想法来处理字面值为(void*)?
1条答案
按热度按时间2uluyalo1#
最好的方法是声明一个具有正确值的正确类型的
static const
对象,并传递它的地址。虽然C99为复合文字添加了一个方便的语法,但它生成的机器码效率低于使用static const
的方法,并且还将产生一个对象的地址,该对象的生命周期将被限制在直接封闭块中。这意味着任何指向该对象的持久化指针都将处于悬空状态。相比之下,任何指向static const
对象的指针将在程序的整个生命周期内保持有效。