2009-02-12 30 views
12

Tôi có đoạn mã sau:bãi bỏ, bãi bỏ, C và C++

typedef void VOID; 
int f(void); 
int g(VOID); 

mà chỉ cần biên dịch tốt trong C (sử dụng gcc 4.3.2 trên Fedora 10). Cùng mã biên dịch như C++ cung cấp cho tôi những lỗi sau:

void.c:3: error: ‘<anonymous>’ has incomplete type 
void.c:3: error: invalid use of ‘VOID’ 

Bây giờ, đây là một cái gì đó trong thư viện bên ngoài và tôi muốn các chủ sở hữu để khắc phục vấn đề đó. Vì vậy, tôi có một câu hỏi - không C + + tiêu chuẩn cấm xây dựng này? Bạn có thể cho tôi một con trỏ/trích dẫn không? Điều duy nhất tôi có thể nhớ lại là khai báo hàm với (void) để báo hiệu danh sách tham số trống không được chấp nhận trong C++, nhưng tôi không hiểu tại sao VOID typedefed không hoạt động.

+0

Đối với những gì nó có giá trị, Visual C++ 2008 không có vấn đề với mã đó. –

+4

Trong windows.h nó thường là một định nghĩa '#define VOID void'. – Ismael

Trả lời

17

Có, theo như tôi biết khai báo thứ hai không hợp lệ trong C++ và C89, nhưng nó hợp lệ trong C99.

Từ Dự thảo C99, TC2 (6.7.5.3/10):

The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

Nó rõ ràng nói về loại "khoảng trống", không phải là từ khóa.

Từ C++ Standard, 8.3.5/2:

If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list.

Đó nó có nghĩa là từ khóa thực tế với "khoảng trống", và không phải là loại nói chung "khoảng trống" cũng có thể được nhìn thấy từ một trong những trường hợp khấu trừ mẫu luận thất bại (14.8.2/2):

  • Attempting to create a function type in which a parameter has a type of void.

Nó đặt rõ ràng bởi những người khác, đáng chú ý trong một báo cáo cốt lõi vấn đề ngôn ngữ here và một số báo cáo lỗi GCC liên quan đến bằng câu trả lời khác.


Tóm lại, GCC của bạn là đúng nhưng phiên bản GCC trước đó sai. Vì vậy, mã đó có thể đã được biên dịch thành công với nó trước đó. Bạn nên sửa mã của bạn, để nó sử dụng "void" cho cả hai hàm, sau đó nó sẽ biên dịch cũng với các trình biên dịch khác (comeau cũng từ chối khai báo thứ hai với "VOID").

+3

Điều đó có nghĩa là nó hợp lệ trong C++ 11 không? –

+1

[n4296] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) các từ rất giống với C99: * Danh sách tham số bao gồm một tham số không có tên của khoảng trống ** không phụ thuộc ** là tương đương với danh sách tham số trống *. Điều đó có nghĩa là khai báo thứ hai có giá trị theo n4296 (và có thể là C++ 11) không? – Nawaz

+1

@Nawaz có nó là –

0

Tôi chỉ đặt mã của bạn vào tệp .cpp và nó được biên dịch không có vấn đề gì trong VS2005, SUSE, Redhat và Solaris, vì vậy tôi đoán phiên bản gcc cụ thể của bạn không chấp nhận điều này. Gal

18

lỗi gcc . Chỉnh sửa: vì nó không đủ rõ ràng, ý tôi là gcc 4.3.2 đã biên dịch nó do lỗi. Xem #32364#9278.

+3

"lỗi gcc" không phải là câu trả lời giao phối –

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