[basic.link/7] phải là phần có liên quan của Tiêu chuẩn. Trong dự thảo hiện tại, nó nói:
Tên của một hàm được khai báo trong phạm vi khối và tên của một biến được khai báo bởi một extern
khai báo phạm vi khối có liên kết. Nếu một tuyên bố như vậy được gắn vào một mô-đun có tên, chương trình không được định dạng. Nếu có một tuyên bố có thể nhìn thấy của một thực thể có liên kết, bỏ qua các thực thể được khai báo bên ngoài phạm vi không gian tên kèm theo trong cùng, thì khai báo phạm vi khối sẽ là một khai báo (có thể không được định dạng) nếu hai khai báo xuất hiện trong cùng một vùng khai báo, khai báo phạm vi khối khai báo cùng một thực thể và nhận được liên kết của khai báo trước đó. Nếu có nhiều hơn một thực thể phù hợp như vậy, chương trình sẽ không được định dạng. Mặt khác, nếu không tìm thấy thực thể phù hợp, thực thể phạm vi khối sẽ nhận được liên kết bên ngoài.Nếu, trong một đơn vị dịch thuật, cùng một thực thể được khai báo với cả liên kết bên trong và bên ngoài, chương trình không được định dạng.
Lưu ý rằng ví dụ tiếp theo gần như khớp chính xác với trường hợp của bạn:
static void f();
extern "C" void h();
static int i = 0; // #1
void g() {
extern void f(); // internal linkage
extern void h(); // C language linkage
int i; // #2: i has no linkage
{
extern void f(); // internal linkage
extern int i; // #3: external linkage, ill-formed
}
}
Vì vậy, chương trình nên được hình thành. Giải thích bên dưới ví dụ:
Nếu không có khai báo ở dòng số 2, khai báo ở dòng số 3 sẽ liên kết với khai báo ở dòng số 1. Tuy nhiên, vì khai báo với liên kết nội bộ bị ẩn, # 3 được cung cấp liên kết bên ngoài, làm cho chương trình không được định dạng.