Chức năng gets()
đã bị xóa khỏi ngôn ngữ C. Không có chức năng như vậy tồn tại trong tiêu chuẩn.Tại sao tôi có thể sử dụng hàm gets() trong gcc -std = c11?
Tuy nhiên, tôi biên dịch đoạn mã sau:
#include <stdio.h>
int main (void)
{
(void) gets (NULL);
}
sử dụng
gcc -std=c11 -pedantic-errors -Wall -Wextra
và nó biên dịch mà không đưa ra bất kỳ lỗi hoặc cảnh báo. Tương tự,
#include <stdio.h>
int gets;
int main (void)
{}
sẽ không biên dịch (lỗi: 'được' redeclared làm loại biểu tượng khác).
Trong tiêu chuẩn 4. Sự phù hợp §6 chúng ta có thể đọc:
A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any strictly conforming program
Với trên, chúng tôi không nghĩ rằng gcc là tiêu chuẩn tuân thủ, ngay cả trong chế độ pedantic. Có một lý do cho điều này? Đây có phải là chủ ý hay là một lỗi?
Phiên bản GCC 4.9.1.
Edit:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
GCC 4.8.2 ở đây. Trong chế độ pedantic đoạn đầu tiên sẽ không biên dịch bởi vì '' không bao giờ được định nghĩa. Trong chế độ không theo nghĩa đen, tôi nhận được 'cảnh báo: hàm \ 'gets' rất nguy hiểm và không nên được sử dụng.'. Đoạn thứ hai không phải là một vấn đề, bởi vì không có gì ngăn cản bạn tuyên bố một biểu tượng được gọi là 'được'. Ví dụ, 'int printf;' là hoàn toàn hợp pháp. Tôi có thiếu điểm của câu hỏi không? –
Bạn đang sử dụng 'libc' nào? Trong các hệ thống giống như chuẩn của hệ thống Unix, thư viện C được vận chuyển với hệ điều hành. Ví dụ, trong Linux nó thường là _glibc_, đã bị xóa 'get' trong phiên bản 2.16 – myaut
@StefanoSanfilippo Bạn dường như thiếu điểm liên quan đến nửa thứ hai, nó không nên thất bại (' được' không nên va chạm với bất cứ điều gì) nhưng nó có. – unwind