2011-12-09 25 views

Trả lời

23

Đó là khi bạn làm điều gì đó như:

int index; 
int main (void) { 
    int index; 
    .... 
    return 0; 
} 

gì nó cảnh báo về là index bên main() thực sự là ẩn một thế giới mà bạn đã khai báo trước khi main().

Cảnh báo với bạn rằng bạn không thể nhận được định nghĩa toàn cầu trong khi địa phương là "hoạt động". Bây giờ, không phải nhất thiết phải là một vấn đề (vì vậy tại sao nó chỉ là cảnh báo), nó hoàn toàn hợp lệ C, nhưng bạn cần phải nhận thức được những hậu quả có thể xảy ra.

Là một sang một bên, một số hiện thực C (BSD-based) xác định một indexchức năng trong string.h mà cũng có thể gây ra vấn đề. Sử dụng chức năng này không được chấp nhận và nó không xuất hiện trong tiêu chuẩn C (sử dụng strchr thay thế) nhưng có thể là nguyên nhân của sự cố nếu bạn đang chạy trên (ví dụ) Mac OS hoặc OpenBSD (hoặc thậm chí Linux dưới một số kết hợp của các cài đặt #define, tôi tin).

Có một số cách để giải quyết vấn đề này (nếu bạn cần).

Cách đầu tiên có thể là ưu tiên: không sử dụng hình cầu. Vâng, đúng vậy, hãy loại bỏ chúng. Chúng rất hiếm khi cần thiết vì vậy đừng khiến tôi đến và tát bạn xung quanh :-)

Cách thứ hai tôi thấy là đảm bảo chúng được "đóng gói". Giả sử rằng bạn thực sự cần globals (không phải là một điều chắc chắn, xem đoạn trước), tạo ra một cấu trúc chứa chúng, chẳng hạn như trong những điều sau đây:

myglobs.h: 
    struct sMyGlobs { 
     int index; 
     // all other globals. 
    }; 
    extern struct sMyGlobs myGlobs; 

myglobs.c: 
    #include "myglobs.h" 
    struct sMyGlobs myGlobs; 

main.c: 
    #include <stdio.h> 
    #include "myglobs.h" 
    int main (void) { 
     myGlobs.index = 42; 
     return 0; 
    } 

này có lợi thế ở chỗ nó là rõ ràng rằng bạn đang đề cập đến toàn cầu và chúng không bao giờ bị ẩn, trừ khi bạn làm điều gì đó như xác định biến cục bộ của riêng bạn được gọi là myGlobs.

+0

Tôi thường sử dụng hình cầu như thông tin trạng thái (được tổng hợp trong cấu trúc cấu hình) khi viết trình điều khiển phần cứng (ví dụ cấu hình phần cứng mới nhất kể từ khi API được sử dụng lần cuối). Thường là cần thiết để lưu trữ thông tin này trong loại tình huống này. Trong những năm qua tôi đã nghe vô số đối số cho _not_ bằng cách sử dụng hình cầu, nhưng một số trường hợp sử dụng 'hợp lệ' khác như bạn thấy là gì? – sherrellbc

+0

Ví dụ: xem [tại đây] (https://github.com/sherrellbc/mock-OS/blob/periph_cmos_dev/mock/kernel/arch/i386/irq/irq_core/pic8259.c#L119-L123) hoặc [tại đây ] (https://github.com/sherrellbc/mock-OS/blob/periph_cmos_dev/mock/kernel/arch/i386/irq/cmos/cmos.c#L134-L138) và [tại đây] (https: // github .com/sherrellbc/mock-OS/blob/periph_cmos_dev/mock/hạt nhân/kiến ​​trúc/i386/irq/cmos/cmos.C# L115-L121). Họ vẫn đang làm việc. Trong trường hợp này, tôi cần thông tin trạng thái để sử dụng trong trình xử lý ngắt không đồng bộ. Có thể cho rằng một cái gì đó như thế này không thể được thực hiện _without_ globals. Nó phụ thuộc vào bối cảnh, như mọi khi. – sherrellbc