2016-03-10 17 views
6

Theo cuốn sách tôi đang đọc, rand() đòi hỏi #include <cstdlib> trong C++
Tuy nhiên, tôi có thể biên dịch đoạn mã sau sử dụng rand() mà không #include <cstdlib> cũng không using namespace std; trong Visual Studio 2015.
Tại sao hai không cần thiết để biên dịch ? Tôi có nên bao gồm cstdlib?Tại sao rand() biên dịch mà không bao gồm cstdlib hoặc sử dụng không gian tên std?

C++ Code:

#include <iostream> 

int main() 
{ 
    std::cout << rand() << std::endl; 
} 
+1

Bạn có thể biên dịch với tùy chọn '/ showIncludes' (trong thuộc tính dự án của iDE trong" C/C++ | Advanced | Show Includes ") để xem chính xác cách' stdlib' được bao gồm. –

+0

@MichaelBurr Tôi thấy bây giờ, đầu ra trong Visual Studio cho thấy rằng iostream đã bao gồm cstdlib. Có cách nào để biết tệp nào đang được đưa trực tiếp và gián tiếp không? Tôi chỉ tò mò –

+2

Mức độ thụt lề của đầu ra bằng cách sử dụng tùy chọn '/ showIncludes' cho biết tiêu đề nào được bao gồm tiêu đề nào khác. Ví dụ: với Bản cập nhật VS 2015 1, ' 'chỉ trực tiếp bao gồm' '- tất cả các tiêu đề khác được đưa vào được bao gồm gián tiếp bởi' istream' hoặc tiêu đề sâu hơn trong cấu trúc phân cấp. –

Trả lời

7

Có hai vấn đề ở chơi:

  1. Chuẩn tập tin tiêu đề thư viện có thể bao gồm tập tin tiêu đề thư viện tiêu chuẩn khác. Vì vậy, iostream có thể bao gồm cstdlib trực tiếp hoặc gián tiếp.
  2. Tệp tiêu đề có tương đương với thư viện chuẩn C (ví dụ: cstdlib) được phép mang tên thư viện chuẩn C vào không gian tên chung, nghĩa là, bên ngoài không gian tên std (ví dụ: rand.) Điều này được chính thức cho phép từ C++ 11 và đã được dung thứ trước đây.
+0

Ý bạn là gì bởi "trực tiếp hay gián tiếp"? –

+3

@JorgeLuque Ý tôi là, ví dụ: 'iostream' có thể bao gồm' tiện ích' có thể bao gồm 'giới hạn' có thể bao gồm' cstdint' có thể bao gồm 'cstdlib'. – juanchopanza

4

iostream có thể bao gồm cstdlib trực tiếp hoặc gián tiếp. Điều này mang lại std::rand()::rand() trong phạm vi. Bạn đang sử dụng cái sau.

Nhưng có, bạn không nên dựa vào điều này và luôn bao gồm cstdlib nếu bạn muốn sử dụng rand. Và trong mã C++ không sử dụng rand, có nhiều cách tốt hơn để tạo số ngẫu nhiên.

+0

Là ':: rand()' giống như 'rand()'? Điều đó được coi là trong không gian tên toàn cầu? –

+2

Có ':: rand()' giống như 'rand' trong trường hợp của bạn. –

2

Bạn chắc chắn nên sử dụng tệp bao gồm có liên quan cho những gì bạn đang sử dụng trong mã của mình. Nó giúp bạn tiết kiệm từ những điều bất ngờ khi bạn cập nhật trình biên dịch/thư viện lên phiên bản mới. Tôi nghĩ rằng việc thêm std:: vào trước rand là một ý tưởng tốt hơn nhiều so với sử dụng using namespace std; - nhưng theo một trong hai cách, thì KHÔNG nên dựa vào nó mà không có vùng tên, mặc dù điều đó có xu hướng là cách nó hoạt động ở hầu hết các địa điểm tương thích ngược cho mã C.

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