2008-11-14 15 views
6

Làm cách nào tôi có thể yêu cầu trình tiền xử lý không thay thế một macro cụ thể?Ngăn chặn tiền xử lý trước để thực hiện một khoản trợ cấp vĩ mô cụ thể

Sự cố cụ thể như sau: Tệp tiêu đề Windows xác định macro GetMessage.

Tệp tiêu đề C++ của tôi với API của tôi có phương thức GetMessage. Tôi không muốn đổi tên phương thức của mình. Nhưng khi sử dụng API trên Windows, bao gồm cả windows.h thay thế lời gọi phương thức GetMessage của tôi bằng GetMessageA.

+0

Chỉ cần làm #undef GetMessage không tốt, vì mã sử dụng API cũng sử dụng Windows GetMessage. –

+0

Ah, một ví dụ khác về việc sử dụng các macro không được phân biệt của Windows SDK là không gian tên bất kỳ và tất cả các không gian tên (và không chỉ trong tính năng không gian tên của C++). –

+0

@vincent: xem don.Nhận xét của newfeld trong câu trả lời '#undef GetMessage' của ShoeLace là –

Trả lời

6

có bạn đã cố gắng chỉ làm một

#undef GetMessage

hoặc thậm chí

#ifdef GetMessage 
#undef GetMessage 
#endif

và sau đó gọi các cửa sổ GetMessageA hoặc GetMessageW trực tiếp, nào là thích hợp.

bạn nên biết nếu bạn đang sử dụng char * cho wchar_t8 ..

(nhờ don.neufeld)

Brian cũng nói rằng Jus một số thông tin hữu ích, bạn cũng có thể sử dụng push_macro #pragma/pop_macro để đẩy và bật các định nghĩa macro. Điều này thật tuyệt nếu bạn muốn ghi đè định nghĩa macro trong một khối mã:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Tôi nghi ngờ đây là tính năng cụ thể của MS, vì vậy hãy ghi nhớ điều đó.

+0

Nhưng sau đó tôi không thể sử dụng Windows GetMessage nữa –

+0

Có thể, chỉ cần gọi GetMessageA hoặc GetMessageW trực tiếp, tùy theo điều nào phù hợp. –

+0

Và, có, push_macro và pop_macro là MS cụ thể. Pragmas được định nghĩa thực hiện theo định nghĩa, và tôi đã không nhận thấy những mã MS bên ngoài. Tất nhiên, điều này có thể không phải là vấn đề đối với ai đó mã hóa với API Windows. –

1

Có mã nào gọi cả GetMessage và Cửa sổ GetMessage của bạn không?

Mã như vậy sẽ không thể phân biệt được giữa hai trong số chúng. Bạn sẽ không thể gọi cả hai trong cùng một tệp.

Nếu bạn sử dụng một hàm trong một tệp và một hàm khác trong tệp khác, chỉ cần thực hiện #undef được đề xuất trong một tệp.

0

Với những hạn chế của bạn như được nêu trong bình luận của bạn, cách duy nhất bạn có thể làm điều này là để làm một:

#undef GetMessage 

ngay trước khi cuộc gọi đến GetMessage của API của bạn. (Và điều này giả định không ai sau thời điểm này trong các tập tin nguồn được gọi Win32 GetMessage.)

+0

Đó không phải là cách duy nhất, nhưng nó sẽ yêu cầu bạn KHÔNG bao gồm windows.h. :) –

6

(GetMessage)(...)

GetMessage on MSDN

+0

Trong khi điều này thường là một cách hay để tránh vô tình bị ghi đè bởi macro, tôi không nghĩ rằng nó sẽ làm việc cho GetMessage, vì nó không được định nghĩa là macro 'giống như hàm'. –

+1

Ồ, đúng ... điều này chỉ hoạt động nếu hàm được khai báo trước macro, chứ không phải sau (mà tôi không nghĩ là được đảm bảo). MSN – MSN

4

Jus một số thông tin hữu ích, bạn cũng có thể sử dụng #pragma push_macro/pop_macro để đẩy và các định nghĩa macro pop. Điều này thật tuyệt nếu bạn muốn ghi đè định nghĩa macro trong một khối mã:

#pragma push_macro("GetMessage") 
#undef GetMessage 

// Your GetMessage usage/definition here 

#pragma pop_macro("GetMessage") 

Tôi nghi ngờ đây là tính năng cụ thể của MS, vì vậy hãy ghi nhớ điều đó.

+0

MS cụ thể không phải là vấn đề khi sự cố xảy ra trong macro được xác định bởi windows.h :-P –

+0

Đó là vấn đề vì không có bộ biên dịch MS không nhắm mục tiêu Windows (ví dụ: mingw). – CesarB

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