2011-12-17 22 views
23

Tôi đang cố gắng sử dụng tệp thư viện stdbool.h trong chương trình C. Khi tôi cố gắng biên dịch, tuy nhiên, một thông báo lỗi xuất hiện nói intellisense không thể mở tập tin nguồn stdbool.h.cố gắng sử dụng '#include <stdbool.h>' trong VS 2010

Mọi người có thể vui lòng cho biết làm cách nào để có được studio trực quan để nhận ra điều này không? Tệp tiêu đề này có hợp lệ không? Tôi đang đọc một cuốn sách về lập trình C.

+11

'' là C99. Visual studio sẽ không bao giờ hỗ trợ nó. Tìm trình biên dịch khác. –

+5

Rõ ràng thời tiết lạnh không có giới hạn (tức là nó có thể bị tuyết rơi trong thế giới ngầm), hỗ trợ C99 cuối cùng cũng bắt đầu với VS 2013, bao gồm cả stdbool.h. [http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx] – John

+8

@AlexandreC .: xin chào từ năm 2015!VS mới nhất có stdbool.h ngay bây giờ! * cười khúc khích * – Mints97

Trả lời

25
typedef int bool; 
#define false 0 
#define true 1 

chỉ hoạt động tốt. Các tiêu đề Windows cũng làm như vậy. Hoàn toàn không có lý do gì để băn khoăn về bộ nhớ "lãng phí" được chi tiêu bằng cách lưu trữ một giá trị hai bit trong một int.

Như Alexandre đã đề cập trong nhận xét, trình biên dịch C của Microsoft (đi kèm với Visual Studio) doesn't support C99 và có khả năng sẽ không xảy ra. Thật không may, bởi vì stdbool.h và nhiều tính năng khác hữu ích hơn nhiều được hỗ trợ trong C99, nhưng không phải trong Visual Studio. Nó bị mắc kẹt trong quá khứ, chỉ hỗ trợ chuẩn cũ hơn được gọi là C89. Tôi ngạc nhiên là bạn chưa gặp phải vấn đề khi cố định nghĩa các biến ở đâu đó khác với sự bắt đầu của một khối. Điều đó cắn tôi mỗi lần tôi viết mã C trong VS.

Một cách giải quyết khác là cấu hình Visual Studio để biên dịch mã dưới dạng C++. Sau đó, gần như mọi thứ bạn đã đọc trong sách C99 sẽ hoạt động mà không cần trình biên dịch nghẹt thở. Trong C++, loại bool được tích hợp (mặc dù nó là loại 1 byte ở chế độ C++, chứ không phải loại 4 byte như trong chế độ C). Để thực hiện thay đổi này, bạn có thể chỉnh sửa cài đặt biên dịch của dự án trong IDE hoặc bạn có thể chỉ cần đổi tên tệp để có đuôi mở rộng cpp (thay vì c). VS sẽ tự động thiết lập chế độ biên dịch cho phù hợp.

Phiên bản hiện đại của Visual Studio (2013 trở lên) cung cấp hỗ trợ được cải thiện cho C99 nhưng vẫn chưa hoàn chỉnh. Thành thật mà nói, các giải pháp tốt hơn nếu bạn đang cố gắng để tìm hiểu C (và do đó C99 ngày nay) là chỉ cần chọn một trình biên dịch khác nhau. MinGW là một tùy chọn tốt nếu bạn đang chạy trên Windows. Rất nhiều người như Code::Blocks IDE

+0

Cảm ơn bạn rất nhiều vì điều này. Tôi đã học được rất nhiều từ chỉ một vài đoạn văn! Cảm ơn một lần nữa! Tôi sẽ thử các trình biên dịch bạn đã đề cập. Chúc giáng sinh tuyệt vời! – John

+0

Đây là câu trả lời hay và hoàn chỉnh. về trình biên dịch, tôi sử dụng DevC + + và cũng Code :: Blocks, không ai trong số họ có intellisense thích hợp và mã màu mà làm cho nó khó đọc mã c một lần nữa. Mặc dù tôi không thích nhiều tính năng mà studio trực quan cài đặt trên hệ thống của bạn bằng vũ lực và nhiều lỗi vẫn còn được thực hiện từ phiên bản 2003 cho đến bây giờ, nó vẫn là tốt nhất trong IDE. Visual Studio 2010 thêm khả năng làm xám các phần bạn đưa vào trong chỉ thị trình biên dịch '# ifdef' không hoạt động. nó rất hữu ích khi bạn đang theo dõi một lỗi biên dịch – AaA

+0

Dưới đây là các báo cáo lỗi liên quan về Kết nối: [773523] (http://connect.microsoft.com/VisualStudio/feedback/details/773523/) và [748766] (http://connect.microsoft.com/VisualStudio/feedback/details/748766/). Bỏ phiếu để họ có thể nghĩ về việc triển khai C99 và C11 thiếu tiêu đề. –

13

Tạo tập tin riêng của bạn để thay thế stdbool.h trông như thế này:

#pragma once 

#define false 0 
#define true 1 

#define bool int 

Trong Visual Studio 2010 Tôi đã có một vấn đề sử dụng typedef int bool; như đề xuất ở nơi khác. IntelliSense đã phàn nàn về "sự kết hợp không hợp lệ của các loại thông số." Dường như tên "bool" vẫn còn đặc biệt, mặc dù nó không được định nghĩa.

+0

+1 . Điều đó làm việc cho tôi. – JackOLantern

+0

Tôi đã tham chiếu giải pháp này tại đây: https://github.com/metabench/jsgui-node-png/issues/2 Lưu trữ PDF: https://www.dropbox.com/s/dgyzrx89w6g4oit/npm%20install%20jsgui -node-p ... pdf –

+1

Nó đặc biệt cho IntelliSense, bởi vì trình biên dịch IntelliSense front-end là trình biên dịch C++. Cụ thể, trong VS 2010, nó là trình biên dịch EDG. Bạn chỉ có thể bỏ qua các cảnh báo IntelliSense. –

2

Cũng giống như cảnh báo, trên nền tảng x64, VS2017 (Tôi không chắc chắn về các phiên bản trước) xác định bool là giá trị 1 byte trên C++ (ví dụ: char). Vì vậy, đây

typedef int bool; 

có thể được thực sự nguy hiểm nếu bạn sử dụng nó như một int (4 byte) trong các tập tin C và là một nguồn gốc bool trong C++ (1 byte) (ví dụ như một struct trong một .h có thể có kích thước khác nhau tùy thuộc nếu bạn biên dịch nó bằng C hoặc C++).

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