c++中的函数重声明

Function redeclaration on C++

本文关键字:声明 函数 c++      更新时间:2023-10-16

我一直在检查一个工具的实现,我发现了一些不寻常的事情。

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

为什么函数的声明在实现的上面?这有什么用?

提前感谢!

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

一个简单的例子是当你需要在很多地方使用这个函数的时候:

static void fun(int x);
static void f() {
    fun(5);
}
static void fun(int x) {
    cout<<"X = "<<x<<endl;
}

如果没有声明,它将无法编译,因为在f()::fun(5)中调用编译器不知道该函数存在。该声明表示(通常称为"prototype")此函数存在并在某处定义(稍后将进行检查)。

如果没有这个原型,你会得到编译错误:

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) {

可以删除声明的第一行

就目前情况来看,它没有多大意义。但是,一般来说,即使这些都在cpp文件中,它也为您提供了移动定义的灵活性。

 void foo()
 {}
 void bar() 
 {
      foo();
 }

是可以的,但如果您后来决定是相反的,并且实际上foo需要调用bar,那么顺序就是一个问题。

如果你以

开头
void foo();
void bar();
... 
// definitions

然后您可以随意移动定义(只是不超过声明)

在这种情况下,不需要声明。如果在fun的定义之前添加一个调用fun的新函数,该声明就会变得有用。函数声明将为新函数提供关于如何调用fun的足够详细信息,以使其能够编译。