我一直在审查工具的实现,我发现了一些不寻常的东西。
#ifdef __GNUC__
#define VARIABLE_IS_NOT_USED __attribute__ ((unused))
#else
#define VARIABLE_IS_NOT_USED
#endif
static VARIABLE_IS_NOT_USED void load_vertex_intervals(std::string base_filename, int nshards, std::vector<std::pair<vid_t, vid_t> > & intervals, bool allowfail);
static VARIABLE_IS_NOT_USED void load_vertex_intervals(std::string base_filename, int nshards, std::vector<std::pair<vid_t, vid_t> > & intervals, bool allowfail=false) {
std::string intervalsFilename = filename_intervals(base_filename, nshards);
std::ifstream intervalsF(intervalsFilename.c_str());
if (!intervalsF.good()) {
if (allowfail) return; // Hack
logstream(LOG_ERROR) << "Could not load intervals-file: " << intervalsFilename << std::endl;
}
assert(intervalsF.good());
intervals.clear();
vid_t st=0, en;
for(int i=0; i < nshards; i++) {
assert(!intervalsF.eof());
intervalsF >> en;
intervals.push_back(std::pair<vid_t,vid_t>(st, en));
st = en + 1;
}
for(int i=0; i < nshards; i++) {
logstream(LOG_INFO) << "shard: " << intervals[i].first << " - " << intervals[i].second << std::endl;
}
intervalsF.close();
}
为什么函数声明在实现之上?有什么用呢?
提前致谢!
编辑:发布代码,而不是简化示例
答案 0 :(得分:2)
简化示例是当您需要在很多地方使用此功能时:
static void fun(int x);
static void f() {
fun(5);
}
static void fun(int x) {
cout<<"X = "<<x<<endl;
}
没有声明它将无法编译,因为在f():: fun(5)中,调用编译器不知道此函数是否存在。该声明称(afaik称为&#34;原型&#34;)该功能存在并在某处定义(将在之后检查)。
如果没有这个原型,您将收到编译器错误:
t.cpp: In function ‘void f()’:
t.cpp:20:10: error: ‘fun’ was not declared in this scope
UPD:在你发布的代码中,这个声明毫无意义。 在
static VARIABLE_IS_NOT_USED void load_vertex_intervals(std::string base_filename, int nshards, std::vector<std::pair<vid_t, vid_t> > & intervals, bool allowfail);
static VARIABLE_IS_NOT_USED void load_vertex_intervals(std::string base_filename, int nshards, std::vector<std::pair<vid_t, vid_t> > & intervals, bool allowfail=false) {
您可以使用声明删除第一行。
答案 1 :(得分:1)
目前看来,没有多大意义。但是,通常情况下,即使这都在cpp文件中,它也可以让您灵活地移动定义。
E.g。
void foo()
{}
void bar()
{
foo();
}
没关系,但是如果你后来决定反过来,实际上foo
需要调用bar
,那么订单就是个问题。
如果你从
开始void foo();
void bar();
...
// definitions
然后你可以随意移动定义(只是不在声明之上)。
答案 2 :(得分:0)
在这种情况下,您不需要声明。如果您添加一个在fun定义之前调用fun的新函数,则声明将变得有用。函数声明将为新函数提供有关如何调用fun以允许其编译的足够详细信息。