2013-08-10 82 views
6

Cuốn sách mà tôi hiện đang đọc tiểu bang rằng khi bạn khai báo một hàm trong c không chấp nhận đối số, nhưng bạn không sử dụng từ khóa void ", hàm call có thể chuyển bất kỳ đối số nào mà nó muốn". vì vậy tôi đã cố gắng này.Danh sách tham số trống có nghĩa là gì?

int number(); 

int main(void) 
{ 
    int x =1; 
    printf("%d",number(x)); 
} 

int number() 
{ 
    return x; 
} 

nhưng nó không biên dịch ??? Cái này hoạt động ra sao?

+0

ở đâu 'số() '' x' nhận từ chính xác? Liên quan đến câu hỏi thực tế của bạn về sự khác biệt trong C giữa 'func (void)' và 'func()' xem [this q & a] (http://stackoverflow.com/questions/5929711/c-function-with-no-parameters- hành vi? lq = 1). – WhozCraig

+0

Cuốn sách này là gì? Tôi đoán rằng cuốn sách chỉ là sai, hoặc hợp lý hơn, đã lỗi thời. – Undefined

Trả lời

0

Vâng, nếu bạn muốn vượt qua cái gì đó để nó không có giới hạn, bạn có thể cần một một đối số biến list.Here là một ví dụ:

#include <stdio.h> 
    #include <stdarg.h> 
    int number(int , ...); 

    int main(void) 
    { 
     int x =1; 
     printf("%d",number(1,x)); 
    } 
    int number(int n, ...) 
    { 
      va_list   ap; 
      va_start(ap,n); 
      int x = va_arg(ap,int); 
      va_end(ap); 
      return x; 
    } 

Hoặc, nếu bạn chỉ muốn vượt qua x nhưng không sử dụng nó.

#include <stdio.h> 
    int number(); 

    int main(void) 
    { 
     int x =1; 
     printf("%d",number(x)); 
    } 

    int number() 
    { 
    int x = 1; 
    return x; 
    } 

Nó có thể biên dịch và hoạt động. Khi bạn khai báo int number(); trong C, bạn có nghĩa là chức năng này có thể được cung cấp loại không đặc biệt. tuy nhiên, bạn không thể sử dụng nó.

1

Vấn đề ở đây là số chức năng của bạn không có kiến ​​thức về x.
Tức là, khi bạn có hàm số trả về x, nó không có bất kỳ x trong phạm vi nào để trả về, và vì vậy đây là lỗi biên dịch. Nếu, thay vào đó, bạn đã viết:

int number() { 
    return 5; 
} 

nó sẽ biên dịch tốt.

+0

Tôi đoán những gì bạn đang nói là bạn nếu bạn vượt qua đối số cho một chức năng như vậy, bạn không thể truy cập chúng bên trong chức năng? – FutureSci

+0

Vâng, chính xác. Tôi không thể thấy sử dụng nhiều cho điều này, nhưng tôi cho rằng nếu bạn có một chuỗi các con trỏ hàm, hầu hết trong số đó lấy một tập hợp các thông số cụ thể, và một trong số đó không có, bạn có thể khai báo một tham số() thay vì (void) để có thể lặp qua mảng đó với cùng các tham số mỗi lần. – qaphla

-2

Tôi đã chỉnh sửa toàn bộ câu trả lời sau khi tìm câu trả lời.

Điều bạn muốn làm là số (void) không chính (void). Đó là những gì bạn muốn và sẽ in bất kỳ biến nào làm số nguyên. Nếu bạn vượt qua số char "F" (void) sẽ trả về số 70, dạng int của "F". Trong mã:

int number(void e); 

void main(){ 
    char C = 'F'; 
    printf("%d",number(C)); 
}; 

int number(void e){ 
    return e; 
}; 

Lưu ý:

Bạn luôn luôn phải vượt qua một cuộc tranh cãi nếu bạn muốn có một biến đó là ra khỏi phạm vi.

+0

Tôi biết về các chức năng và thông số, câu hỏi của tôi là cố ý để đối phó với việc truyền dữ liệu đến các hàm không có danh sách tham số được chỉ định. Vì vậy, KHÔNG, số() KHÔNG nên có một loại bên trong phạm vi của câu hỏi này. – FutureSci

+0

@worlboss Sau đó, đó là không thể làm bạn của tôi. Hãy nhớ rằng máy tính là "câm". Bạn tạo các quy tắc mà anh ta sẽ tuân theo tuyệt đối và trừ khi bạn nói hàm có một tham số mà chương trình sẽ không sử dụng nó. Trong thực tế bằng cách gọi một hàm có kiểu tham số không được báo trước, điều này sẽ làm hỏng chương trình và gỡ lỗi nó sẽ không biên dịch (nếu tôi đúng) vì máy tính sẽ không biết "phải làm gì" (đó là lý do bạn ở đây). –

+0

Ngoài ra, thông thường phải nhập chính xác, hoặc là chính (void) hoặc làm chính (char ** argv, int argc). chính() không phải là bất kỳ chính xác hơn, nhưng cũng không phải là bất kỳ chi tiết. – qaphla

7

Đây là tính năng lỗi thời từ trước C được chuẩn hóa, nhiều thập kỷ trước.

Không bao giờ sử dụng.

Trong C cổ đại, một thập kỷ trước khi bạn được sinh ra, bạn có thể khai báo một hàm không có tham số. Khi bạn gọi nó, trình biên dịch sẽ quảng bá các tham số cho các kiểu mặc định và chuyển chúng đến hàm. Về cơ bản, trình biên dịch đã tìm ra các khai báo tham số từ các đối số trong cuộc gọi.

Hàm vẫn phải là được xác định với thông số và chúng phải khớp với cách hàm được gọi.


“Tính năng” là từ sai. Đó là cách mọi thứ đã được thực hiện vào thời điểm đó, vì những cách tốt hơn vẫn chưa được phát triển rộng rãi. Trong một ngôn ngữ lập trình mới, đặc điểm này sẽ được coi là thiếu hụt.

4

Để hỗ trợ câu trả lời Eric Postpischil của tôi xin trích dẫn từ các tiêu chuẩn C11 (6.11 hướng ngôn ngữ Future)

6.11.6 Chức năng declarators

Việc sử dụng các chức năng declarators với dấu ngoặc đơn trống (không trình khai báo kiểu thông số định dạng mẫu) là một tính năng bị lỗi thời .

6.11.7 Chức năng các định nghĩa

Việc sử dụng các định nghĩa hàm với tham số nhận dạng riêng biệt và danh sách khai (không nguyên mẫu định dạng kiểu tham số và nhận dạng declarators) là một tính năng lỗi thời.

Nhấn mạnh là của tôi :)

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