2016-12-29 14 views
5

Trong C++, khai báo một biến nhiều lần sẽ hiển thị lỗi trong quá trình biên dịch. Ví dụ:Khai báo hàm và biến nhiều lần trong C++

int x; 
int x; 

Trong khi tuyên bố một hàm nhiều lần không hiển thị bất kỳ lỗi nào trong quá trình biên dịch. Ví dụ:

int add(int, int); 
int add(int, int); 

Tại sao sự khác biệt này trong C++?

+0

Chức năng có thể bị quá tải nhưng số lượng và loại thông số phải khác nhau. Các biến không thể bị quá tải. – nischalinn

+0

Nó không quá tải của nó chỉ redeclaring. tuyên bố có thể được thực hiện bất cứ lúc nào. – user1438832

+0

đó không phải là tuyên bố của chức năng, nó là tuyên bố nguyên mẫu, có thể được thực hiện nhiều lần. Đây là sự phân biệt kể từ khi C thực sự. Nguyên mẫu là khai báo không có phần thân, khai báo và thân thể được coi là định nghĩa, chỉ có thể xảy ra một lần – Swift

Trả lời

12

Lưu ý rằng int x; không phải là (chỉ) declaration, đó là definition. Vì vậy, lỗi phát sinh từ ODR bị vi phạm, nghĩa là chỉ một định nghĩa được phép trong một đơn vị dịch.

Một tuyên bố của biến có thể được viết như sau:

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

Trong khi đó int add(int, int); là một tuyên bố (chức năng) chính xác. Nhiều khai báo trong một đơn vị dịch là tốt, ODR không bị vi phạm.

+1

Bạn có thể muốn tiếp tục và giải thích rằng khai báo 'int add (int int)' không phải là định nghĩa, do đó ODR không áp dụng. – Peter

+0

Cảm ơn bạn đã giải thích! Nó trả lời nghi ngờ của tôi. :) –

+0

Cần lưu ý rằng việc khai báo các hàm trong tiêu đề là cực kỳ quan trọng đối với việc quản lý phụ thuộc (chủ yếu nói rằng "bạn có thể giả định rằng tại thời gian liên kết phải có hàm với chữ ký này"). Tuyên bố chuyển tiếp này có thể dễ dàng dẫn đến các bản sao nếu các tiêu đề khác nhau có cùng khai báo được bao gồm. Tuy nhiên, định nghĩa trùng lặp của các biến có nghĩa là 2 trường hợp khác nhau của một cái gì đó có cùng tên, và không có cách nào để phân biệt chúng. (Do đó nó không được phép.) –