2016-03-04 19 views
5

Gần đây tôi đã viết một đoạn mã C như thế:Tôi có nên xem xét việc khai báo tất cả các hàm tĩnh C là một tính năng tốt?

static void func1() 
{ 

} 

static void func2() 
{ 

} 


typedef void (*func_t)(void); 

const func_t lookUpTable[FUNC_COUNT] = 
{ 
    [FUNC1] = &func1, 
    [FUNC2] = &func2 
} 

Một lập trình viên khác làm việc trên cùng một tập tin và thay đổi nó để:

static void func1(); 
static void func2(); 

typedef void (*func_t)(void); 

const func_t lookUpTable[FUNC_COUNT] = 
{ 
    [FUNC1] = &func1, 
    [FUNC2] = &func2 
} 

static void func1() 
{ 

} 

static void func2() 
{ 

} 

Kể từ khi funcN chức năng chỉ được gọi là thru bảng tra cứu, tôi không thực sự cần các khai báo của các hàm đó.

Đây có phải là vấn đề về hương vị hay là có một kiểu mã hóa được coi là thực hành tốt/xấu?

Cảm ơn câu trả lời của bạn!

+0

"Tôi không thực sự cần khai báo" - Bạn vẫn làm! Nếu không có bạn không thể sử dụng tem trong bảng của bạn. Bỏ qua 'static' OTOH không làm cho _declaration_ extern, chỉ có tên/biểu tượng. – Olaf

+0

Có thể có vấn đề về từ vựng ở đây. Có tốt hơn nếu tôi nói "Tôi không cần các nguyên mẫu"? Ý tôi là khi tôi * định nghĩa * các hàm được * khai báo * cùng một lúc. Nó là một phần quan điểm của bạn? Về phần cuối của nhận xét của bạn: có nghĩa là không có 'tĩnh', tên/biểu tượng sẽ được công khai. Và vì vậy, nếu tên này được sử dụng trong một đơn vị dịch thuật khác thì việc biên dịch sẽ bị phá vỡ vì không thể tìm thấy nội dung/triển khai (?)? – Plouff

+0

1) sử dụng '@ name' để thêm nhận xét đáng tin cậy. Nhận xét cuối cùng của bạn không làm cho nó rõ ràng hơn với tôi. Có lẽ nhận xét ban đầu của tôi trở nên rõ ràng hơn ở giữa rằng tôi có xu hướng sử dụng từ vựng C chuẩn. Chỉ cần có một cái nhìn vào nó. Và bạn ** cần ** các nguyên mẫu (trong đó ** là ** _declarations_). Và không có 'static', một tên được khai báo ở phạm vi tệp có _external linkage_. Cụm từ "công khai" không được tiêu chuẩn sử dụng (và có nghĩa khác, ví dụ: trong C++). – Olaf

Trả lời

3

Thực sự là vấn đề về hương vị (và kiểu mã hóa là luôn là bằng cách nào đó ý kiến; phong cách đối tác của bạn phù hợp với thói quen đặt tất cả mã sau mỗi định nghĩa khác). Trong thực tế, bạn nên đảm bảo rằng tên chức năng của bạn là duy nhất (nó làm cho grep -ing cho chúng dễ dàng hơn, và gdb sẽ tìm thấy chúng dễ dàng hơn) trong toàn bộ chương trình, ngay cả khi chúng hiển thị hoặc chỉ sử dụng bên trong một đơn vị dịch thuật.

BTW, có chức năng của bạn không tĩnh cũng có một số lợi thế. Ví dụ: trên Linux, các hàm backtrace(3) & dladdr(3) vui hơn với các hàm được đặt tên chung trên toàn cầu.

Ngoài ra, đôi khi computed gotosthreaded code (hoặc thậm chí là một đồng bằng lớn switch ....) là nhanh hơn so với một văn bảng gọi ngắn chức năng gián tiếp thông qua một con trỏ. (Các chức năng gọi điện nhỏ, ví dụ: chạy phần mở đầu và phần kết của chúng, đôi khi có thể quan trọng đối với mã chạy nhanh và nhỏ). Xem tài liệu tham khảo here & there.

+0

Làm cho chúng 'tĩnh tĩnh là thực hành tốt, vì nó tránh gây ô nhiễm không gian tên chung. – Olaf

+0

Không phải lúc nào. Một số chương trình đang sử dụng 'backtrace' (ví dụ báo cáo lỗi trong trình thông dịch), và sau đó có tất cả các hàm được công khai là khôn ngoan (trong trường hợp đó, bạn sẽ chỉ có các hàm' static inline', còn lại là các hàm toàn cục) –

+1

'static inline' là một vấn đề khác (lưu ý đây là C).Nếu bạn đang lên đến gỡ lỗi, bạn không nên sử dụng tối ưu hóa nào đó anyway (cho gcc sử dụng '-Og'). – Olaf

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