我有一个C ++ 03类,只有一个头文件实现。该类使用在所有类之间共享的静态空向量:
static const byte nullVector[64];
当我在课堂外初始化时,链接由于重复的符号而失败。所以我将它移动到一个函数中,根据How to have static data members in a header-only library?
制作了一个静态局部函数现在我试图从访问者返回该字节数组:
static const byte[64]& GetNullVector {
static const byte s_NullVector[64] = {
0,0,0,0,0,0,0,0, ... 0,0,0,0,0,0,0,0
};
return s_NullVector;
}
虽然尝试返回byte[]&
可能看起来很奇怪,但由于编译时断言,我需要它:
COMPILE_ASSERT(DIGEST_SIZE <= COUNTOF(GetNullVector()));
COUNTOF
宏需要一个真正的数组,它在指针上失败。当字节数组是静态类成员时,它工作正常。
如何返回对字节数组的引用,并完成其大小,以便诊断在C ++ 03下继续按预期工作?
提前致谢。
这是编译错误的样子。 static const byte[64]
和static const byte[]
的返回类型都会产生错误。
c++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c validat3.cpp
In file included from validat3.cpp:16:
./hkdf.h:33:19: error: expected member name or ';' after declaration specifiers
static const byte[]& GetNullVector {
~~~~~~~~~~~~~~~~~^
./hkdf.h:58:49: error: use of undeclared identifier 'GetNullVector'
COMPILE_ASSERT(DIGEST_SIZE <= COUNTOF(GetNullVector()));
答案 0 :(得分:4)
C数组的语法包含它附加到的标识符(例如int array[64]
)。
当你引用它时,它会变得更加丑陋:
int (&array_ref)[64]
现在如果你想从函数中返回这样的引用:
int (& GetNullVector())[64] { ... }
但是对于某些typedef,你可以避免在下次代码审查中解释这个丑陋的声明;)
typedef byte null_vec_t[64];
static const null_vec_t& GetNullVector()
{
static const null_vec_t s_NullVector = {0};
return s_NullVector;
}