C++ 相同作用域的函式和變數不可同名
阿新 • • 發佈:2019-02-16
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想說,看程式碼時,一定要看仔細了。犯這種錯誤,不僅耽誤了時間,還容易讓牢記的知識變得混淆。