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?
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
@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? –
@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. –