我想做一个宏,当给定一个类型T时,它将返回一个指针类型,当传递给一个函数时,它是只读的,就像这样:
void foo( readonly_ptr(char) str )
{
// can only read from str, not modify it
}
事实证明,这比我想象的要难,因为仅仅在前面加上const
是不够的.
我现在的代码是:
#define readonly_ptr(T) \
const typeof(T)*
它适用于"简单"类型.
但并不适用于所有类型.
当给定指向数组的指针类型(例如int(*)[10]
)时,它会将其转换为int(*const*)[10]
,这仍然允许函数如下修改数组:
void foo( readonly_ptr(int(*)[10]) arr )
{
(**arr)[0] = 1;
}
类似地,对于指针类型(例如char*
),它将其转换为char *const*
,从而可以修改其底层char
.
有没有办法制作一个保证只读参数的宏?
如果不是,有没有其他方法可以确保函数不会修改参数,而不必每次都指定确切的类型.
我还try 在每次需要只读类型时总是超过const void*
,然而,这仍然是合法的-可以转换为可修改的类型.