Đối với thư viện Win32 tĩnh, làm cách nào tôi có thể phát hiện thấy bất kỳ tùy chọn "Sử dụng MFC" nào được đặt?Cách phát hiện "Sử dụng MFC" trong bộ xử lý trước
ví dụ:
#ifdef ---BuildingForMFC---
....
#else
...
#endif
Đối với thư viện Win32 tĩnh, làm cách nào tôi có thể phát hiện thấy bất kỳ tùy chọn "Sử dụng MFC" nào được đặt?Cách phát hiện "Sử dụng MFC" trong bộ xử lý trước
ví dụ:
#ifdef ---BuildingForMFC---
....
#else
...
#endif
Tôi luôn kiểm tra biểu tượng _MFC_VER đang được xác định.
Đây là số phiên bản của MFC được sử dụng 0x0700 = 7.0
Đó là trong "Predefined Macros" trong MSDN
Biểu tượng _AFX
thường được định nghĩa cho các dự án MFC.
tôi đã kiểm tra trên Visual Studio 2013, trong một dự án ban đầu nhắm mục tiêu chỉ Win32 giao diện điều khiển, vì vậy tôi đã thêm hỗ trợ MFC (không cần sử dụng Trình hướng dẫn dự án) trong lần thứ hai. Sau đây là những phát hiện của tôi:
macro _MFC_VER được định nghĩa trong afxver_.h, bao gồm bởi afx.h. Vì vậy, nếu bạn không bao gồm afx.h trực tiếp/gián tiếp trong tệp .cpp của bạn, bạn không có macro _MFC_VER được xác định. Ví dụ: bao gồm trong dự án nguồn .cpp không bao gồm afx.h, tệp sẽ được biên dịch KHÔNG CÓ định nghĩa macro _MFC_VER. Vì vậy, nó vô dụng để thích ứng với mã C++ (một thư viện bên ngoài, ví dụ) để phát hiện việc sử dụng thư viện MFC và tùy chọn hỗ trợ thư viện MFC.
Nếu bạn tự bật việc sử dụng MFC (Chọn dự án trong Solution Explorer, hơn click chuột phải, Configuration Properties -> General -> Sử dụng MFC) bạn có hai khả năng:
Vì vậy, trong thời gian hoạt động thử nghiệm của tôi, chỉ có chế độ A có thể được sử dụng một cách hiệu quả để hiểu nếu thư viện MFC nêu trên có hoặc không nằm trong dự án dưới tòa nhà.
Tôi duy trì thư viện đa nền tảng C++ hỗ trợ nhiều nền tảng (Mac OSX, WinX, iOS, Unix, Android) và bật MFC với DLL động là cách duy nhất để phát hiện sự hiện diện MFC một cách minh bạch. Ví dụ:
#if defined(_AFXDLL)
# include <afx.h>
#endif
Rõ ràng, bạn có thể thêm định nghĩa macro theo cách thủ công (_AFX) vào danh sách bộ xử lý dự án.
Tôi nghĩ quá muhc, nhưng khi bật "Sử dụng MFC trong thư viện động" cho dự án Thư viện Win32 (đã được tạo mà không có tùy chọn 'Hỗ trợ MFC'), macro này không được xác định. – peterchen
Như @peterchen đã nói, _AFX không được định nghĩa nếu MFC là tùy chọn thư viện động đang hoạt động, nhưng _AFXDLL thay thế. – Mouze