2015-01-03 17 views
8

Các mã sau biên dịch và chạy nhưng tôi hy vọng một cảnh báo khi biên dịch:GCC không phát ra một cảnh báo khi biên soạn

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 

    int x = 10; 
    printf("%p\n",&x); 

    return EXIT_SUCCESS; 
} 

GCC,from an online compiler với đối số dòng lệnh

-Wall -std=gnu99 -O2 -o a.out source_file.c -pedantic -Wextra 

đưa ra cảnh báo sau khi biên soạn

source_file.c: In function ‘main’: 
source_file.c:7:3: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("%p\n",&x); 

vì tôi chưa thêm (void*) đúc trước &x như %p hy vọng một đối số kiểu void* .Nhưng khi tôi biên dịch sử dụng

gcc SO.c -o so -Wall -Wextra -pedantic -std=c11 

hoặc

gcc SO.c -o so -Wall -Wextra -pedantic -std=c99 

hoặc

gcc SO.c -o so -Wall -Wextra -pedantic -std=c89 

GCC (trong máy tính của tôi) không không đưa ra cảnh báo trong khi biên dịch (một lần nữa trong PC của tôi) sử dụng

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu11 

hoặc

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu99 

hoặc

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu89 

hoặc

gcc SO.c -o so -Wall -Wextra -pedantic 

Tôi nhận được cảnh báo nêu trên. Tại sao nó lại như vậy? Phiên bản GCC của tôi là 4.8.1 và tôi đang sử dụng Windows. Tôi biên dịch từ bảng điều khiển, ví dụ: cmd.

+0

Có phải mingw gcc, cygwin gcc hay cái gì khác không? – ouah

+0

@ouah, tôi không biết chính xác, nhưng sử dụng 'gcc -v' hiển thị' Mục tiêu: mingw32'. Vì vậy, tôi đoán mingw gcc của nó –

Trả lời

2

Tại sao lại như vậy?

Trước tiên, tôi cũng có thể tạo lại trạng thái không nhất quán này với mingw32 gcc 4.8.1 trên máy tính của tôi.

Trong khi chẩn đoán là không bắt buộc (không có sự vi phạm ràng buộc) theo tiêu chuẩn C, không có lý do gì gcc đưa ra chẩn đoán với -std=gnu11 và không phải với -std=c11.

Hơn nữa với gcc 4.8.2 trên Linux trên máy của tôi, chẩn đoán xuất hiện với cả hai -std=c11-std=gnu11.

Vì vậy, nó trông giống như một lỗi trong gcc (trong gcc 4.8.1 hoặc trong mingw32 gcc 4.8.1).

+0

Tôi sẽ giả định mingw thiếu một '__attribute __ ((định dạng (printf, 3,4)))' trong các tập tin tiêu đề stdio của mingw trên printf() khai báo - mà không có điều đó, printf chỉ là một chức năng varadic bình thường, và không thể kiểm tra định dạng có thể được cung cấp bởi -Wformat – nos

+1

@nos có thể là tài liệu gcc thuộc tính định dạng nói rằng * Trình biên dịch luôn luôn (trừ khi -ffreestanding hoặc -fno-builtin được sử dụng) kiểm tra định dạng cho các hàm thư viện chuẩn printf, [...] bất cứ khi nào cảnh báo như vậy được yêu cầu (sử dụng -Wformat), do đó không cần sửa đổi tệp tiêu đề stdio.h * để có vẻ ngay cả khi không có thuộc tính gcc nên cảnh báo. – ouah

+0

@ouah, Câu hỏi này có liên quan đến [this this] (http://stackoverflow.com/questions/27363795/mingw-doesnt-produce-warnings) không? –

0

Tài liệu cho cả GNU libc và C99 libc (trang 315 của số pdf) nói rõ ràng rằng đối số cho chuyển đổi %p "phải thuộc loại void *".

Thực tế là cảnh báo không được đưa ra phải là một đặc điểm của những gì trình biên dịch của bạn nghĩ về các tiêu chuẩn Cxx. Cổ phiếu gcc 4.8.2 trên Ubuntu 14.04 đưa ra cảnh báo cho tất cả sáu tiêu chuẩn được đề cập trong bài đăng của bạn.

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