2013-06-01 40 views
25

Tôi bắt đầu số Learn C The Hard Way của Zed Shaw. Tôi đã tải xuống XCode và Công cụ Dòng lệnh. Nhưng khi tôi biên dịch chương trình đầu tiên:Cảnh báo GCC: khai báo ngầm của hàm 'đặt' không hợp lệ trong C99

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

tôi nhận được cảnh báo này:

ex1.c: 2: 1: cảnh báo: khai ngầm của 'puts' chức năng là không hợp lệ trong C99 [-Wimplicit-function-declaration]

Chương trình biên dịch và thực thi chính xác.

Tôi đang sử dụng OSX 10.8.3. Nhập 'gcc -v' cho:

Sử dụng thông số kỹ thuật tích hợp sẵn. Mục tiêu: i686-apple-darwin11 Được cấu hình với: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix =/Applications/Xcode.app /Contents/Developer/usr/llvm-gcc-4.2 --mandir =/share/man --enable-languages ​​= c, objc, C++, obj-C++ --program-prefix = llvm- --program-transform-name =/^ [cg] [^ .-] * $/s/$/- 4.2/--with-slibdir =/usr/lib --build = i686-apple-darwin11 --enable-llvm =/private/var /tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix = i686-apple-darwin11- --host = x86_64-apple-darwin11 --target = i686-apple- darwin11 --with-gxx-include-dir =/usr/include/C++/4.2.1 Mô hình chủ đề: posix gcc phiên bản 4.2.1 (Dựa trên Apple Inc. xây dựng 5658) (LLVM build 2336.11.00)

Xin hãy giúp đỡ.

+0

Sử dụng 'int main (int argc, char * argv [])' khi đối số không được sử dụng là hơi ngớ ngẩn; nó phải là 'int main (void)' hoặc thậm chí 'int main()' thay thế. Tuy nhiên, đó là một cuộc tranh luận cho một ngày khác, có lẽ. Tôi lưu ý rằng GCC 5.x sử dụng C11 ('-std = gnu11') làm chế độ biên dịch mặc định. 'clang' (giả mạo là' gcc') sử dụng C99. Cả C99 và C11 đều yêu cầu tất cả các hàm (ngoại trừ 'main()') được khai báo trước khi chúng được sử dụng. –

Trả lời

40

Bạn cần phải bao gồm stdio.h, ví dụ:

#include <stdio.h> 

lúc bắt đầu nhập định nghĩa hàm.

+2

Cũng trong bài 2, Zed chỉ ra rằng bạn có thể loại bỏ cảnh báo bằng cách sử dụng câu lệnh include của bạn. Vì vậy, tôi đang ghi có cho bạn câu trả lời đúng. – grok12

3

"Sách" này phải được đổi tên thành Tìm hiểu cách ghét C bằng cách làm theo các ví dụ vô nghĩa có nghĩa là không hợp lệ.

Mã đúng trong C hiện đại sẽ là đơn giản và dễ dàng

#include <stdio.h>  // include the correct header 

int main(void) {   // no need to repeat the argument mantra as they're not used 
    puts("Hello world."); 
}       // omit the return in main as it defaults to 0 anyway 

Trong khi ví dụ ban đầu

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

có thể đã được chỉ đơn giản xấu vào năm 1989, trong (18 năm trước khi viết câu trả lời này, và gần như nhiều năm s trước khi "cuốn sách" được viết) tiêu chuẩn C đã được sửa đổi. Trong bản sửa đổi C99, loại implicit function declaration này đã được thực hiện bất hợp pháp - và naturally it remains illegal in the current revision of the standard (C11). Vì vậy sử dụng putsmà không #include ing tiêu đề có liên quan, ví dụ: prepending #include <stdio.h> (hoặc tuyên bố puts chức năng với int puts(const char*);) là một lỗi chế.

Lỗi ràng buộc là lỗi phải làm cho trình biên dịch đưa ra thông báo chẩn đoán. Ngoài ra, một chương trình như vậy được coi là một chương trình không hợp lệ. Tuy nhiên, điều đặc biệt về tiêu chuẩn C là nó cho phép trình biên dịch C biên dịch thành công một chương trình không hợp lệ, mặc dù trình biên dịch cũng có thể từ chối nó. Vì vậy, ví dụ như vậy hầu như không phải là một điểm khởi đầu tốt trong một cuốn sách được cho là dạy C cho người mới bắt đầu.

+0

Liên kết đó có phải là trang web/kho lưu trữ tiêu chuẩn chính thức không? – Ungeheuer

+0

@Ungeheuer không, thật không may [tiêu chuẩn chính thức] (https://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents) chi phí tiền. Đây là phiên bản HTML của bản nháp cuối cùng * C11 * được biết đến với tên hoạt động ** n1570 **. –

+0

Cảm ơn người đàn ông. Câu hỏi cuối cùng. Trang web được liên kết có các tiêu chuẩn trước không? Tôi không thấy cách điều hướng ra khỏi đó. – Ungeheuer

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