Gần đây tôi đã cố gắng đọc thêm mã nguồn mở C. Một mô hình chung mà tôi đã áp dụng trong các dự án sở thích của tôi là như sau: -các hàm nội dòng tĩnh trong một tệp tiêu đề
Trong các tệp C của tôi, tôi có các hàm tĩnh hoặc xuất. Chỉ các hàm được xuất khẩu mới được đặt trong tệp tiêu đề. Các biến toàn cầu chỉ được sử dụng trong phạm vi của một đối tượng cũng được sử dụng làm biến toàn cầu tĩnh.
Câu hỏi của tôi liên quan đến tính hữu ích và động lực của việc có các hàm "tĩnh nội tuyến" bên trong các tệp tiêu đề. Từ những gì tôi đọc trực tuyến, không sử dụng các từ khóa tĩnh gây ra một lỗi định nghĩa nhiều và đó là lý do không chỉ xác định chức năng như chỉ là "nội tuyến".
Tuy nhiên, điều này có nghĩa là chức năng này được xuất cho các đối tượng khác để sử dụng? Nếu có, thì tại sao không chỉ định nghĩa hàm này trong tệp C và xuất nó qua tệp tiêu đề? Nếu không, tại sao đặt điều này trong tệp tiêu đề thay vì chỉ có nó bên trong tệp C?
Có lý do nào đằng sau kiểu mã hóa này không? Tôi đang thiếu gì?
Một trong những ví dụ có thể được tìm thấy trong codebase git bên hashmap.h
:
/*
* Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code
* for use in hash tables. Cryptographic hashes are supposed to have
* uniform distribution, so in contrast to `memhash()`, this just copies
* the first `sizeof(int)` bytes without shuffling any bits. Note that
* the results will be different on big-endian and little-endian
* platforms, so they should not be stored or transferred over the net.
*/
static inline unsigned int sha1hash(const unsigned char *sha1)
{
/*
* Equivalent to 'return *(unsigned int *)sha1;', but safe on
* platforms that don't support unaligned reads.
*/
unsigned int hash;
memcpy(&hash, sha1, sizeof(hash));
return hash;
}
Xin vui lòng gửi một câu hỏi ngắn gọn đơn ủng hộ với các ví dụ, không phải một mà đòi hỏi phải xây dựng ưa thích " kiểu mã hóa ". – Fabulous
Để bạn tham khảo: https://stackoverflow.com/help/mcve – Fabulous
Bằng cách "xuất", bạn có nghĩa là "bên ngoài" không? Bạn có lẽ cụ thể hơn có nghĩa là "tuyên bố với một" extern' lưu trữ lớp specifier "? –