版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxc024000/article/details/82151855
C++ 全局函数与全局变量不可同名
- C++中相同作用域的函数和变量不可同名
// 编译报错
int a = 10;
void a(){ // some code}
- 某日,在Chromium源码中看到如下代码。咋一看,以为函数与变量同名了,但是编译时没有错误。
// xxx.cpp文件
extern "C" {
static AwDrawGLFunction DrawGLFunction;
static void DrawGLFunction(long view_context,
AwDrawGLInfo* draw_info,
void* spare) {
// |view_context| is the value that was returned from the java
// AwContents.onPrepareDrawGL; this cast must match the code there.
reinterpret_cast<android_webview::RenderThreadManager*>(view_context)
->DrawGL(draw_info);
}
}
- 开始时,BZ以为难道C++14,允许相同作用域的函数与变量同名了???于是在谷歌上搜了很久,发现并没有类似的资料。自己也写类似的代码,编译时,肯定会报错。
- 其实,上述代码时完全正确的。因为AwDrawGLFunction,是函数指针类型。
// AwDrawGLFunction
typedef void (AwDrawGLFunction)(long view_context,
AwDrawGLInfo* draw_info,
void* spare);
- 所以上述代码,其实就是先做了函数声明,紧接着函数定义。
// xxx.cpp文件
extern "C" {
// 函数声明
static AwDrawGLFunction DrawGLFunction;
// 函数定义
static void DrawGLFunction(long view_context,
AwDrawGLInfo* draw_info,
void* spare) {
// |view_context| is the value that was returned from the java
// AwContents.onPrepareDrawGL; this cast must match the code there.
reinterpret_cast<android_webview::RenderThreadManager*>(view_context)
->DrawGL(draw_info);
}
}
- 总结:其实BZ想说,看代码时,一定要看仔细了。这种犯这种错误,不仅耽误了时间,还容易让牢记的知识变得混淆。