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的宏版本很不错。