我想知道为什么这种代码可以得到测试数组的大小?我对模板中的语法不熟悉。也许有人可以解释下代码的含义template<typename,size_t>。此外,参考链接也是首选。
#define dimof(array) (sizeof(DimofSizeHelper(array)))
template <typename T, size_t N>
char(&DimofSizeHelper(T(&array)[N]))[N];
void InitDynCalls()
{
char test[20];
size_t n = dimof(test);
printf("%d", n);
}
Run Code Online (Sandbox Code Playgroud) 我想写一些带字符串文字的函数 - 只有一个字符串文字:
template <size_t N>
void foo(const char (&str)[N]);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这太过于扩展并且会匹配任何数组char- 无论它是否是真正的字符串文字.虽然在编译时无法区分它们之间的区别 - 而不必在运行时求助调用者包装文字/数组 - 但这两个数组将在内存中完全不同的位置:
foo("Hello"); // at 0x400f81
const char msg[] = {'1', '2', '3'};
foo(msg); // at 0x7fff3552767f
Run Code Online (Sandbox Code Playgroud)
有没有办法知道字符串数据在内存中的位置,以便我至少可以assert使该函数仅采用字符串文字?(使用gcc 4.7.3,但实际上任何编译器的解决方案都会很棒).
我有一个函数,它接受一个字符数组及其大小:
void store_string (const char *p, size_t size); // 'p' & 'size' stored in map
Run Code Online (Sandbox Code Playgroud)
该函数由宏包装为:
#define STORE_STRING(X) store_string(X, sizeof(X))
Run Code Online (Sandbox Code Playgroud)
我的问题是,我想以某种方式禁止或通知用户只应将字符串文字传递给此函数.因为,如果任何指针或本地数组存储在地图内,那么它们可能会超出范围并造成严重破坏!
是否有任何编译时方式(首选)或至少是运行时方式吗?