2015-05-17 20 views
10

Tôi có một cuộc gọi đơn giản tới std::setenv, hoạt động tốt trên bản phân phối Linux của tôi theo số gcc. Tuy nhiên, khi sử dụng clang trên Mac OS X của mình, tôi nhận được lỗi sau.Thư viện chuẩn C++ - std :: setenv vs setenv

error: no member named 'setenv' in namespace 'std'; did you mean simply 'setenv'? 
std::setenv(name.c_str(), value.c_str(), true); 

tôi chắc chắn rằng, tôi đã đọc ở đâu đó rằng setenv là một phần của không gian tên std trong C++ 11, nhưng bây giờ tôi không chắc chắn.

Câu hỏi: Nên sử dụng setenv hoặc std::setenv và tại sao lại xảy ra trường hợp này?

Trả lời

12

tôi không find bất cứ điều gì như std::setenv trên cppr, chỉ std::getenv mà trong tài liệu hướng dẫn của nó tham chiếu POSIX chức năng setenv, trong đó tất nhiên là không trong namespace std. Vì vậy, kể từ khi bạn không gọi một hàm chuẩn C++, đồng bằng setenv nên là con đường để đi vì đây là cách tiêu chuẩn xác định hàm được định nghĩa nó. Lưu ý rằng std::setenv được cho phép (nhưng không bắt buộc) để hoạt động. (Xem thêm hvd's comment.)

Đối với tiêu chuẩn người yêu: setenv chỉ được nhắc đến như

Các cuộc gọi đến các chức năng getenv sẽ không giới thiệu một cuộc chạy đua dữ liệu (17.6.5.9) với điều kiện là không có gì sẽ thay đổi môi trường . [Lưu ý: Cuộc gọi đến các chức năng POSIX setenvputenv sửa đổi môi trường. - kết thúc lưu ý]

từ N3797 18.10.5. Nó thực sự không phải là một hàm tiêu chuẩn C++, do đó không nhất thiết phải trong namespace std.

+1

Tiêu chuẩn C++ không xác định 'setenv', vì vậy nếu triển khai xác định nó như một phần mở rộng, chúng có thể sử dụng không gian tên chung, không gian tên' std' hoặc bất kỳ không gian tên nào khác, tuy nhiên chúng thấy phù hợp. Việc triển khai của OP thực hiện khai báo nó trong không gian tên 'std' chỉ hợp lệ như việc triển khai khác của OP mà không thực hiện. (Để làm rõ: Tôi đồng ý rằng đồng bằng 'setenv' là những gì OP nên sử dụng, nhưng câu trả lời của bạn đi qua như thể thực tế là' std :: setenv' hoạt động là một lỗi.) – hvd

+0

@hvd Nhưng thiếu thêm tài liệu (I không biết cũng không tìm thấy bất kỳ 'setenv' nào khác ngoài POSIX), tôi giả định rằng anh ta đang nói về POSIX và tự hỏi liệu nó có phải là hàm C++ chuẩn hay không. Vì hàm POSIX không có trong 'không gian tên std', cuộc gọi toàn cầu sẽ là cách chung để truy cập nó. Trong khi một số nền tảng như gcc rõ ràng trên linux thêm nó vào 'namespace std', tiêu chuẩn định nghĩa nó không. Liệu tôi có sai? –

+0

@hvd Cũng lưu ý rằng tôi không bao giờ nói rằng 'std :: setenv' không được phép làm việc, không được bảo đảm. –

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