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