2014-05-08 30 views
1

我正在製作一個ncurses應用程序,並且我遇到了令人困惑的事情。爲什麼我在使用ncurses時沒有一個名爲「refresh」的成員?

如果你有一個名爲成員的struct「刷新」這是一個函數指針,並調用該函數後,您將獲得以下編譯時錯誤:

main.c:20:10: error: ‘Point’ has no member named ‘wrefresh’ 
    point.refresh(); 

這裏有一個小測試你可以嘗試編譯:

#include <ncurses.h> 

typedef struct PointStruct Point; 

void Point_refresh() { 

} 

struct PointStruct { 
    int x; 
    int y; 
    void (*refresh)(); 
}; 

int main() { 
    Point point; 
    point.x = 0; 
    point.y = 0; 
    point.refresh = &Point_refresh; 
    point.refresh(); 
} 

這會給你上面提到的錯誤。但是,如果您取出包含ncurses的第一行,則它將在沒有問題的情況下編譯。

這對ncurses不起作用的原因是什麼,並有解決方法嗎?這不是什麼大不了的事情,只是輕微的煩惱,我不得不重新命名該成員。

回答

2

因爲refresh()是一個 「僞功能」 #define d被詛咒爲wrefresh(win)宏,所以預處理器將取代所有出現這個詞在你的來源中。對於#undef它沒有任何明智的方法,而是始終使用wrefresh()代替。

+2

還有另外一種方法:在函數名稱周圍加上括號。 – ooga

+0

我認爲,這種治療比這種疾病更糟。 –

+0

啊,這很有道理! – RylandAlmanza

2

替換:

point.refresh(); 

有了:

(point.refresh)(); 
+0

甚至更​​好'(* point.refresh)();' –

相關問題