2011-01-29 31 views
13

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

+0

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'. –

Trả lời

4

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ố WinMainmain 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ì.

11

_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.

+2

Đ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). –

+0

Làm thế nào/nơi nào '_CONSOLE' được xác định? – jww

3

Đó 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.

+0

+1: Tôi viết cả hai hàm. – Puppy

+1

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

+2

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'. –

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