C ++上的函数重新声明

时间:2015-05-30 13:03:33

标签: c++

我一直在审查工具的实现,我发现了一些不寻常的东西。

#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();
    }

为什么函数声明在实现之上?有什么用呢?

提前致谢!

编辑:发布代码,而不是简化示例

3 个答案:

答案 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以允许其编译的足够详细信息。