C++ 相同作用域的函数和变量不可同名

版权声明:本文为博主原创文章,未经博主允许不得转载。 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想说,看代码时,一定要看仔细了。这种犯这种错误,不仅耽误了时间,还容易让牢记的知识变得混淆。

猜你喜欢

转载自blog.csdn.net/zxc024000/article/details/82151855