2011-08-30 71 views
6

Các số nhận dạng sau không có liên kết: số nhận dạng được khai báo là bất kỳ thứ gì ngoài đối tượng hoặc hàm; một định danh được khai báo là tham số hàm; một định danh phạm vi khối cho một đối tượng được khai báo không có bộ định danh lớp lưu trữ extern.Phạm vi liên kết phạm vi C tiêu chuẩn

{ 
    static int a; //no linkage 
} 

Đối với một định danh khai báo với specifier extern lưu trữ hạng nhất trong một phạm vi trong đó một tuyên bố trước đó của nhận dạng đó là có thể nhìn thấy, nếu việc khai báo trước quy định cụ thể nội bộ hay bên ngoài liên kết, các liên kết của các định danh tại tuyên bố sau đó giống như liên kết được chỉ định tại tờ khai trước. Nếu không có khai báo trước, hoặc nếu khai báo trước chỉ định không có liên kết, thì số nhận dạng có liên kết bên ngoài.

{ 
    static int a; //no linkage 
    extern int a; //a should get external linkage, no? 
} 

lỗi GCC: khai extern của một sau tuyên bố không có mối liên hệ

Ai đó có thể giải thích cho tôi tại sao tôi nhận được lỗi này?

Cảm ơn bạn

+1

Có thể là ngữ nghĩa, "xác định không có mối liên kết" so với "quy định" không liên kết". Quảng cáo tự động trong trường hợp này nghe có vẻ điên rồ. –

+0

Tôi không hiểu sự khác biệt. Bạn có thể xây dựng? – mindless

Trả lời

8

Giả sử của bạn là chính xác: tuyên bố thứ hai là a có liên kết bên ngoài. Tuy nhiên, bạn nhận được một lỗi bởi vì mã của bạn vi phạm một hạn chế trong §6.7:

3 If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space, except for tags as specified in 6.7.2.3.

Đó là, một khi bạn đã tuyên bố a không có mối liên hệ, bạn không thể redeclare nó một lần nữa trong phạm vi tương tự.


Một ví dụ hợp lệ của quy tắc này được gọi là:

int a = 10; /* External linkage */ 

void foo(void) 
{ 
    int a = 5; /* No linkage */ 

    printf("%d\n", a); /* Prints 5 */ 

    { 
     extern int a; /* External linkage */ 

     printf("%d\n", a); /* Prints 10 */ 
    } 
} 
+1

Bạn có thể cho tôi một ví dụ hợp lệ không: nếu khai báo trước không chỉ định liên kết, thì số nhận dạng có liên kết bên ngoài. Tôi không thể nghĩ ra được. – mindless

+0

@mindless: Tôi đã thêm một ví dụ vào câu trả lời của mình. – caf

2

if the prior declaration specifies no linkage

nghĩa

if the prior declaration specifies not a sign of linkage

và không

if the prior declaration specifies that it has no linkage

Đây là khó hiểu và mơ hồ; không phải cách thông thường để viết tiêu chuẩn ...

+0

Bạn có thể xóa tĩnh, lỗi sẽ vẫn ở đó. Tĩnh trong phạm vi khối không thay đổi liên kết, chỉ có thời gian lưu trữ. Trong phạm vi tập tin nó thay đổi liên kết, nhưng không phải là thời gian lưu trữ (luôn luôn tĩnh). Một sự mơ hồ khác trong c. – mindless

+0

Bạn sai; ý nghĩa dự định là cái cuối cùng, chính xác như nó được viết. Nó không có mang về câu hỏi, anyway. – caf

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