C++ 编译时的静态字符数组大小

Muh*_*mad 1 c++

我知道这个问题被问了很多次,我没有问如何做到这一点,因为我是在编译时这样做的。我的问题是它是如何工作的,因为这是我不明白的。

当将 a 传递char[]给函数时,它会丢失其信息并变成char*,因此我们无法在编译时使用模板获取字符数组的大小,所以我尝试传递字符串本身并且它有效:

template <int N> inline int arr_len(const char (&)[N]) { return N - 1; }

#define STR "this is an example!"

const char *str_ptr = STR;

int main()
{
  int array_size = arr_len(STR);
}
Run Code Online (Sandbox Code Playgroud)

我使用 VC++ 2008、Intel C++ 12 和 GCC 4.7 测试了这段代码,它可以工作。

通过传递字符串本身,编译器将其视为const char[]- 至少我是这么认为 - 并且他能够获取字符串大小,这怎么可能?

Cat*_*lus 5

字符串文字类型是数组,而不是指针。因此,当您将其直接传递给通过引用获取数组的函数时,它不会衰减为指针。