C++:使用内部链接转发声明 const
C++ : forward declaring const with internal linkage
我想转发声明一个常量变量而不给它外部链接。然而,在我看来,这是不可能的,因为 extern
关键字同时表示 "this has external linkage" 和 "this is a variable declaration, not a definition",而且我不能缺一不可:
//// main.cpp: ////
extern const char table[256]; // forward declaration. External linkage.
// const char table[256]; // Error: table requires an initializer
// static const char table[256]; // Same error
// foo uses table so I need it forward declared:
char foo()
{
// uses table
}
const char table[256] = {...}; // Actual definition
我的理解对吗?有什么解决方法吗?
首先,前向声明只为类型定义。你可以输入
class X;
然后用X *
为例。
您在这里要实现的是在实际使用之前声明 symbol。
我知道的唯一方法是通过 extern
关键字。
但是如果想在内部建立符号链接,匿名命名空间可以提供帮助
namespace {
extern const char table[256]; // symbol declaration. Internal linkage.
}
char foo() {
// use table
}
namespace {
const char table[256] = {...}; // symbol definition. Internal linkage.
}
这是一个你可以做的测试
$ cat test.cc
extern const char moo[4];
char foo() { return moo[2]; }
const char moo[4] = {0};
$ g++ -c test.cc -o test.o -O3 && g++ test.o -shared -o test.so && nm -gD test.so | grep moo
00000000000005ad R moo
$
$ cat test.cc
namespace {
extern const char moo[4];
}
char foo() { return moo[2]; }
namespace {
const char moo[4] = {0};
}
$ g++ -c test.cc -o test.o -O3 && g++ test.o -shared -o test.so && nm -gD test.so | grep moo
$
我想转发声明一个常量变量而不给它外部链接。然而,在我看来,这是不可能的,因为 extern
关键字同时表示 "this has external linkage" 和 "this is a variable declaration, not a definition",而且我不能缺一不可:
//// main.cpp: ////
extern const char table[256]; // forward declaration. External linkage.
// const char table[256]; // Error: table requires an initializer
// static const char table[256]; // Same error
// foo uses table so I need it forward declared:
char foo()
{
// uses table
}
const char table[256] = {...}; // Actual definition
我的理解对吗?有什么解决方法吗?
首先,前向声明只为类型定义。你可以输入
class X;
然后用X *
为例。
您在这里要实现的是在实际使用之前声明 symbol。
我知道的唯一方法是通过 extern
关键字。
但是如果想在内部建立符号链接,匿名命名空间可以提供帮助
namespace {
extern const char table[256]; // symbol declaration. Internal linkage.
}
char foo() {
// use table
}
namespace {
const char table[256] = {...}; // symbol definition. Internal linkage.
}
这是一个你可以做的测试
$ cat test.cc
extern const char moo[4];
char foo() { return moo[2]; }
const char moo[4] = {0};
$ g++ -c test.cc -o test.o -O3 && g++ test.o -shared -o test.so && nm -gD test.so | grep moo
00000000000005ad R moo
$
$ cat test.cc
namespace {
extern const char moo[4];
}
char foo() { return moo[2]; }
namespace {
const char moo[4] = {0};
}
$ g++ -c test.cc -o test.o -O3 && g++ test.o -shared -o test.so && nm -gD test.so | grep moo
$