2011-07-24 22 views
6

Để biên dịch một số mã di sản Ac, trong đó có một hàm nguyên mẫuPhương ngữ nào có thể cho phép GCC biên dịch một số thú vị (...)?

void somefun(...) 

gcc 4.1.2 luôn nói với một lỗi

error: ISO C requires a named argument before ... 

Nhưng tôi không thể thay đổi mã, vì vậy tùy chọn dialet gì C nên Tôi sử dụng để cho GCC biên dịch mã này?

gcc -c A.c ???? 
+2

Điều đó có ý nghĩa gì không? Nếu bạn không có đối số được đặt tên, bạn có thể không truy cập được bất kỳ đối số nào. Vì vậy, nó phải giống như 'void somefun()' (mà vẫn khác với 'void somefun (void)' !!) – Szabolcs

+0

Tôi không thấy bất kỳ tùy chọn nào của phiên bản mới gcc đều có thể làm điều này. – Stan

+0

có thể trùng lặp của [Có thể có một hàm variadic trong C không có tham số non-variadic không?] (Http://stackoverflow.com/questions/2622147/is-it-possible-to-have-a-variadic- function-in-c-with-no-non-variadic-parameter) –

Trả lời

3

Tôi không nghĩ rằng bất kỳ của C phương ngữ trong GCC chấp nhận điều này, nhưng G + + không. Những gì bạn có thể làm là đặt định nghĩa hàm trong khối extern "C" {} và biên dịch mô-đun có chứa nó với g++ (giả sử nó cũng là hàm C++ hợp lệ).

Bạn phải khai báo trong C với void somefun() (K & kiểu R).

Điều này cũng sẽ yêu cầu liên kết với g++.

Nếu liên kết C++ không phải là thứ bạn muốn, thì bạn nên thay đổi hàm để không có đối số và khai báo nó theo kiểu K & R.

+0

Mã này thực sự biên dịch trên một số máy unix cũ sử dụng cc, và thậm chí không có bất kỳ tùy chọn cụ thể nào. Vì vậy, có vẻ như tôi nên kiểm tra phiên bản CC của máy đầu tiên. Cảm ơn. – YourBestBet

4

Tôi không nghĩ điều đó có thể nữa. Xem nhận xét trong mục này (3.4.0 - đã cũ) Nguồn GCC c-parse.in:

GCC 2.95.3 có cùng nhận xét.

các phiên bản mới hơn của GCC (4.6.1) cũng không thấy có một tùy chọn để chấp nhận mã (từ gcc/c-parse.c):

static struct c_arg_info * 
c_parser_parms_list_declarator (c_parser *parser, tree attrs) 
{ 
... 
    if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 
    { 
     struct c_arg_info *ret = build_arg_info(); 
     /* Suppress -Wold-style-definition for this case. */ 
     ret->types = error_mark_node; 
     error_at (c_parser_peek_token (parser)->location, 
     "ISO C requires a named argument before %<...%>"); 
     c_parser_consume_token (parser); 
Các vấn đề liên quan