validation传递给函数的字符串类型(例如文字,数组,指针)
我有一个函数,它接受一个字符数组及其大小:
void store_string (const char *p, size_t size); // 'p' & 'size' stored in map
该函数由宏包装为:
#define STORE_STRING(X) store_string(X, sizeof(X))
我的问题是,我想以某种方式禁止或通知用户只应将字符串文字传递给此函数。 因为,如果任何指针或本地数组存储在地图内,那么它们可能会超出范围并造成严重破坏!
是否有任何编译时方式(首选)或至少是运行时方式来执行此操作?
只需将宏更改为:即可知道编译时间:
#define STORE_STRING(X) store_string("" X, sizeof(X))
用法:
char a[] = "abcd", *p; STORE_STRING(a); // error STORE_STRING(p); // error STORE_STRING("abcd"); // ok
这不起作用,sizeof(char *)返回指针的大小而不是分配的内存或字符串大小。
strlen(x)通过查找’\ 0’返回字符串的大小。
如果您需要/想要一个非宏解决方案,那么有一个模板技巧可以提供帮助。 您可以拥有如下所示的函数签名:
template void store_string( char const (&str)[len] ) { store_string_internal( str,len); } template void store_string( char (&str)[len] ) { static_assert( false ); }
第一种forms接受字符串文字并调用目标函数。 第二种forms防止传递非const字符数组。 是的,不要提供char const*
版本。
这并不能保证字符串是字符串文字,但绕过它的一种语法极为罕见(我从未使用它)。
否则iammilind的宏版本很不错。