2010-12-13 46 views
5

Tôi không hiểu lý do tại sao việc khai báo dưới đây được chấp nhận:Tại sao dấu ngoặc đơn quan trọng trong khai báo con trỏ hàm?

typedef void (*_tStandardDeclaration)(LPVOID); 

trong khi sau đây không:

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

Tôi đang sử dụng MSVC6 (Tôi biết đó là lỗi thời và phi tiêu chuẩn, nhưng cần thiết để duy trì hệ thống doanh thu hàng chục triệu USD hàng năm: /)

+4

Chú ý rằng tất cả những tờ khai typedef là hợp lệ. Không có gì là không hợp lệ C++. –

Trả lời

11

Biểu tượng con trỏ liên kết với loại theo mặc định, do đó con trỏ hàm cần dấu ngoặc đơn để cho biết con trỏ thực sự nằm trên tên chứ không phải trả về t ype.

5

Nếu không có dấu ngoặc đơn, bạn khai báo hàm trả về void*, không phải con trỏ tới hàm trả về void.

3

Mã dưới đây được chấp nhận mà không có một Witter bởi GCC 4.2.1 trên hệ điều hành MacOS X 10.6.5 với trình biên dịch thiết lập để kén chọn:

c++ -Wall -Wextra -c xx.cpp 

Code:

typedef void *LPVOID; 

typedef void (*_tStandardDeclaration)(LPVOID); 

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

Đầu tiên đưa ra một con trỏ đến hàm trả về void; hai cái sau là tương đương (khoảng cách không tạo ra sự khác biệt) và cung cấp cho bạn một kiểu 'hàm (tham số LPVOID) trả về con trỏ để làm mất hiệu lực'.

Bạn có thể sử dụng chúng để khai báo con trỏ hàm:

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer; 

Fun, không phải là nó ...

Các vấn đề liên quan