Tôi đang tạo chính bằng macro và cần phải kiểm tra Hệ thống con đã chọn tại thời gian biên dịch,/SUBSYSTEM: WINDOWS hoặc/SUBSYSTEM: CONSOLE, để tạo chức năng chính. Có một #define tôi có thể kiểm tra mà thực hiện điều này?Có một #define được liên kết với Hệ thống con
Trả lời
Nếu bạn đang cố gắng làm mọi thứ dễ dàng cho người dùng thư viện của bạn (hoặc bất kể nó là gì), bạn chỉ có thể tạo cả hai số WinMain
và main
từ macro của mình. Trình liên kết theo mặc định đặt ứng dụng bảng điều khiển để bắt đầu tại main
và win32 ứng dụng để bắt đầu tại WinMain
. Chức năng "chính" khác sẽ bị bỏ qua.
(Có lẽ phần còn lại của mã không sử dụng bất kỳ đối số chính function (argc
, argv
, hInstance
, vv), nếu nó làm việc với cả hai.)
Các _CONSOLE
xác định có thể được sử dụng , nhưng nó không tự động xuất hiện; bạn phải thêm nó theo cách thủ công vào các thuộc tính của dự án. Việc lựa chọn biểu tượng khởi động, mặt khác, là tự động. Vì vậy, chỉ cần cung cấp cả hai chức năng và cho phép trình liên kết chọn, có thể giúp cuộc sống trở nên dễ dàng hơn, vì người tạo dự án không phải thiết lập bất kỳ thứ gì và thực sự có thể chuyển từ cửa sổ sang ứng dụng giao diện điều khiển (thậm chí có thể cho mỗi cấu hình) mà không phải thực hiện bất cứ điều gì.
_CONSOLE
nên thực hiện thủ thuật cho bạn.
Ngoài ra, bạn có thể chọn hệ thống con sử dụng #pragma comment(linker, "/subsystem:windows")
hoặc #pragma comment(linker, "/subsystem:console")
nếu bạn thực sự muốn đi tuyến đường này.
Điều này chắc chắn là câu trả lời tốt hơn vì nó trực tiếp trả lời câu hỏi ban đầu về việc chỉ định hệ thống theo cách thủ công và cho phép trình liên kết xác định nó (hoặc thay đổi cài đặt dự án). –
Làm thế nào/nơi nào '_CONSOLE' được xác định? – jww
Đó không phải là cách nó thực sự hoạt động. Bạn phải viết mã khác biệt đáng kể trong ứng dụng bảng điều khiển so với ứng dụng Windows gốc. Trong một ứng dụng giao diện điều khiển, bạn sử dụng printf hoặc cout để tạo đầu ra, không có nhiều nếu sử dụng cho một con chuột. Một ứng dụng Windows bản địa yêu cầu một vòng lặp tin nhắn và tạo một cửa sổ với một thủ tục cửa sổ phát hiện thông điệp WM_PAINT để cập nhật cửa sổ. Etcetera.
Nhưng bạn có thể viết mã thực hiện cả hai. Chỉ cần viết cả hai hàm main() và WinMain(), CRT sẽ tự động gọi đúng.
+1: Tôi viết cả hai hàm. – Puppy
Trong khi các tuyên bố bạn đã thực hiện là đúng, họ không kể toàn bộ câu chuyện. Có thể viết một ứng dụng có chức năng có hoặc không có hệ thống con giao diện điều khiển thông qua một vài tweek nhỏ. Thông thường đây sẽ là một ứng dụng không cửa sổ (hoặc nó có thể chỉ đơn giản gọi MessageBox) và không có thread UI. Các đường ống tiêu chuẩn cũng có sẵn cho các ứng dụng không phải bàn điều khiển, mặc dù tất nhiên đầu ra của chúng sẽ không được nhìn thấy trừ khi được chuyển hướng. – Tergiver
Thật vậy. Tất cả các ứng dụng của tôi là các ứng dụng giao diện điều khiển trong bản dựng gỡ lỗi và về cơ bản 6 dòng mã bổ sung: một hàm chính thực hiện 'trả về WinMain (0,0,0,0)', tất cả bên trong '#ifdef _CONSOLE'. Bạn thậm chí không thực sự cần '# ifdef'. –
- 1. Hệ thống tệp có hỗ trợ để liên kết cứng
- 2. đá quý/bổ sung cho hệ thống liên kết?
- 3. Có một loại hệ thống bầu cử StackOverflow trên trang Liên kết
- 4. Làm thế nào để gỡ lỗi một liên kết (chậm) trên một hệ thống debian
- 5. làm các liên kết cứng hoặc liên kết mềm có bất kỳ không gian nào trong hệ thống tệp không?
- 6. C Liên kết con trỏ 64 bit
- 7. Hệ thống tích hợp liên tục cho một Codebase Python
- 8. Giải quyết các liên kết với hệ thống tập tin tăng cường
- 9. Cách liên kết tài khoản người dùng ứng dụng phải trả tiền với hệ thống?
- 10. động liên kết với một "con đường" của tài nguyên
- 11. Hệ thống con cửa sổ nào được hỗ trợ trên đĩa khôi phục
- 12. Kết hợp hệ thống SVN FTP?
- 13. Có API nào để kết nối với iCloud và nhận các liên hệ và thay đổi liên hệ không?
- 14. Làm thế nào để nắm bắt được kết quả của một cuộc gọi hệ thống trong một biến hệ vỏ?
- 15. Con trỏ tới một mảng con trỏ đến các danh sách được liên kết
- 16. Bạn có đề xuất TFS hoặc một hệ thống Tích hợp liên tục khác không?
- 17. Lỗi liên kết tăng để tăng hệ thống tệp, tại sao?
- 18. Cách nhận thống kê hệ thống với node.js
- 19. Gọi hệ thống Python là kết quả chuỗi
- 20. Tại sao QtCreator/MSVC liên kết hệ thống DLL 64 bit với ứng dụng 32 bit của tôi?
- 21. Ngăn chặn Weblogic 12c sử dụng liên kết slf4j của hệ thống
- 22. Biểu mẫu được làm tròn với hệ thống Shadow
- 23. Liên kết với nhiều thư viện, một trong số đó kết thúc tốt đẹp một tập hợp các hệ thống gọi
- 24. Chế độ xem bảng có thể chỉnh sửa được liên kết với NSArrayController được liên kết với NSUserDefaultsController
- 25. hệ thống awk gọi
- 26. malloc trong hệ thống nhúng không có hệ điều hành
- 27. số liên kết so với con trỏ rỗng
- 28. dừng tất cả các tác nhân trong một hệ thống mà không cần tắt hệ thống?
- 29. Cách liệt kê tất cả các liên kết tượng trưng trên hệ thống tệp NTFS
- 30. Không thể tìm thấy crtn.o, liên kết mã 32 bit trên hệ thống 64 bit
Bạn không nên tạo ra một chức năng chính, bởi vì tạo ra nó là vô giá trị cho bản thân bạn và một trở ngại cho người khác. I E. nó có tiện ích tiêu cực để làm điều đó. Nhưng nếu bạn làm như thế, hãy tạo ra một hàm 'main', sau đó * tạo ra một tiêu chuẩn' main' *. Nó hoạt động tốt không có vấn đề hệ thống phụ của xây dựng. Lưu ý: với các công cụ của Microsoft, được thử thách một chút trong bộ phận này, hãy đặt tùy chọn trình liên kết '/ entry: mainCRTStartup' trừ khi bạn đang làm một ứng dụng MFC, trong trường hợp này bạn sẽ gặp phải vấn đề của người khác (cụ thể là Microsoft) đã có cùng một ý tưởng thực sự xấu của việc tiếp quản 'main'. –