Trước tiên, sự hiểu lầm của bạn có không có gì để thực hiện với không gian tên, chỉ khoảng static
. Đối với phần còn lại của câu trả lời này tôi sẽ chỉ đơn giản là testNum
bởi vì thực tế nó trong một không gian tên là không liên quan.
Tôi cũng giả định bạn đã một file, có lẽ gọi là test.cpp
, mà còn bao gồm test.h
và xác định setNum
chức năng.
Khi biến hoặc hàm ở phạm vi không gian tên (nghĩa là không phải là thành viên của lớp hoặc cục bộ đối với hàm) được khai báo static
nghĩa là tên của thực thể nằm trong tệp đó. Chính thức nó có "liên kết nội bộ", có nghĩa là nó không thể được gọi bằng tên hoặc liên kết đến từ các tệp khác (nó có thể được gián tiếp gọi thông qua một con trỏ hoặc bằng cách chuyển nó như một đối số cho một hàm khác.) tập tin xác định static int testNum
thì mỗi tệp có biến nội bộ riêng với tên đó, khác biệt với testNum
trong mỗi tệp khác (trên thực tế, một tệp có thể có static int testnum
và một tệp khác có thể có static double testnum
và một tệp khác là static char* testNum
. tệp.) Nếu bạn đặt định nghĩa như vậy trong tiêu đề thì mọi tệp có tiêu đề có testNum
riêng.
Vì vậy, với static
trên biến của bạn trong một tiêu đề bạn có một biến khác nhau gọi testNum
trong mỗi tập tin có chứa test.h
. Điều đó có nghĩa là nếu bạn đặt testNum
trong một tệp và gọi hàm trong một tệp khác sử dụng testNum
, nó đề cập đến một biến số khác nhau, mà chỉ xảy ra có cùng tên.
Do đó, việc khai báo các biến số static
không phải trong tiêu đề hầu như luôn luôn sai.
Nếu không có static
, bạn sẽ có định nghĩa về biến số testNum
trong mỗi tệp bao gồm test.h
, không được phép: mọi thực thể phải được xác định một lần và một lần duy nhất trong chương trình của bạn. Cách giải quyết đó là tuyên bố biến trong tiêu đề, nhưng không phải xác định nó, mà bạn làm bằng cách nói với trình biên dịch biến là extern
:
extern int testNum; // N.B. no "= 1" here
Điều đó nói với trình biên dịch có một biến với "liên kết bên ngoài" được gọi là testNum
, vì vậy khi mã đề cập đến testNum
, nó sẽ luôn có nghĩa là cùng một biến (không phải tên nào đó với linakge nội bộ là một thực thể khác trong mỗi tệp.) Sau khi khai báo biến số extern
, bạn có trách nhiệm đảm bảo chính xác là một định nghĩa được cung cấp ở đâu đó trong chương trình, do đó, trong chính xác một tệp (tức là không có tiêu đề được bao gồm trong nhiều tệp), bạn xác định nó:
int testNum = 1;
Bạn có biết cách '# include' hoạt động không? Nó sao chép-dán nội dung của tập tin được chỉ định. Và định nghĩa 'setNum' có thực sự trong' main.cpp' không? – Xeo
Tôi không hiển thị nó, nhưng tôi có tiêu chuẩn ifNDEF DEF trong .h. bên cạnh đó, vì tôi chỉ bao gồm nó * một lần * trong toàn bộ chương trình, nó vẫn không phải là vấn đề đúng không? – dsollen
Bạn có sử dụng 'sử dụng kiểm tra không gian tên' không? –