c++中的函数重声明
Function redeclaration on 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();
}
为什么函数的声明在实现的上面?这有什么用?
提前感谢!
编辑:发布了代码,而不是简化的示例一个简单的例子是当你需要在很多地方使用这个函数的时候:
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的足够详细信息,以使其能够编译。
相关文章:
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 在c++中在类外声明函数有什么好处
- 使用 #define 声明函数
- 在静态库中声明函数,在使用该相同库的应用程序中定义它
- 如何强制编译器在 C/C++ 本身中声明函数?
- 如果您只需要在 .h 文件中声明函数.cpp是否需要在 .h 文件中声明函数?
- C++:<sys/sysctl.h> 无法声明函数CTL_HW和HW_NCPU
- 尝试声明函数的局部变量,但得到范围错误
- 如何在C++模板中声明函数
- 如何在另一个文件的类中声明函数
- 使用非类型模板参数正向声明函数模板
- 在此范围错误中未声明函数错误
- 当我们不能声明函数内联(GCC 编译器)时?
- 未在此作用域中声明函数,即使存在头文件也是如此
- 无法声明函数中的模板类型别名
- 单个CPP文件中多次声明函数声明可以吗?
- 编译一个支持VBA中声明函数的dll
- 使用从外部参数包中获取的参数类型声明函数
- 使用类成员正确地声明函数
- 在函数内重新声明函数