【发布时间】:2014-06-24 14:34:49
【问题描述】:
我有一个宏,它需要 2 个参数,一个值被修改并获得我必须转换的偏移量。
#define MY_MACRO(dst, src) \
do_something((char *)dst + offset, (char * )src + offset)
在上面的示例中,dst 将被修改,但如果值为 const,则转换为 (char *) 将隐藏此。
但是,我不希望这个宏默默地隐藏const 成员。
static void my_function(const float *a, const float *b)
{
MY_MACRO(a, b); /* <-- this should warn because 'a' is const */
}
我想知道是否有一种好方法可以确保在宏中转换的变量不会隐藏const。
将示例解决方案移动到自己的答案中 - https://stackoverflow.com/a/25072965/432509
【问题讨论】:
-
我怀疑你会找到更好的解决方案(使用宏),因为预处理器对
const之类的东西一无所知。另请注意,not_const可能会被优化掉,使用一定程度的优化,编译器将不再发出警告。 -
添加函数
void do_something_helper(void *dst, const void *src, size_t offset) { do_something((char *)dst + offset, (char * )src + offset) }并制作宏#define MY_MACRO(dst, src) do_something_helper(dst, src, offset)。 -
@chux,
(char *)dst从目的地隐藏const。 -
@ideasman42
do_something_helper(void *dst, ...)中的void *dst已经捕获了const,因此后续隐藏不是问题。 -
@chux 您的评论将非常适合作为答案。
标签: c macros casting constants