Giả sử mình có một vài biến và hàm có thể dùng chung và mình muốn để tụi nó global mình viết như sau trong header file Common.h
int length = 100;
void printSomething();
Trong file C++ thì mình viết code cho hàm printSomething();
Trong file main.cpp mình include Common.h
#include “Common.h”
int main()
{
int data = 300 - length;
printSomething();
}
Khi mình build code thì nó báo lỗi linker vì length đã được định nghĩa rồi. Theo mình hiểu là tại vì trong Common.cpp cũng include Common.h (hiển nhiên) nên khi mình include Common.h trong main.cpp thì nó hiểu là có 2 biến length và vì trùng tên nên bị lỗi linker.
Mình có 3 cách sửa:
Cách 1: định nghĩa luôn hàm trong header để khỏi bị include header nhiều lần.
Cách 2: thêm static vào trước length.
Cách 3: nếu chỉ là variable, mình tạo một cái header riêng gọi là Variable_Common.h và lưu các biến đó ở đây.
Cách 1 mình không nói. Cách 2 và 3 khác nhau ở chổ dùng keyword static. Cho mình hỏi nên hiểu 2 trường hợp này như thế nào và nên dùng như thế nào cho hợp lí? Cho mình hỏi static có tác dụng như thế nào? Theo mình biết nó là như vầy:
- static trong 1 lớp: nếu là một biến trong lớp đó thì biến này sẽ được chia sẻ với các object của lớp này, nếu là method thì có thể gọi thông qua tên lớp mà không cần tạo object.
- static nằm strong hàm: khởi tạo một lần duy nhất khi gọi hàm, những lần gọi sau, hàm sẽ dùng biến static này.
- Nếu như define một biến global và thêm static trong một file nào đó, ví dụ President.h, nhưng mình không include cái President.h ở đâu hết thì có thể hiểu là cái biến đó chỉ global cho đúng President.h mà thôi. Còn lại nó private với các file khác.
Edit: mình không muốn dùng extern.