1. 程式人生 > >C++ 相同作用域的函式和變數不可同名

C++ 相同作用域的函式和變數不可同名

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想說,看程式碼時,一定要看仔細了。犯這種錯誤,不僅耽誤了時間,還容易讓牢記的知識變得混淆。