2012-03-12 36 views
7

Ok, tôi đang tìm cách xác định tập hợp các địa chỉ bộ nhớ dưới dạng hằng số trong tệp .h được sử dụng bởi một nhóm tệp .c (chúng tôi đang ở C, không phải C++). Tôi muốn có thể nhìn thấy tên của biến thay vì chỉ nhìn thấy địa chỉ hex trong trình gỡ rối ... vì vậy tôi muốn chuyển đổi #defines tôi hiện có thành các hằng số có phạm vi toàn cục. Vấn đề là, nếu tôi định nghĩa chúng như thế này:hằng số toàn cầu mà không sử dụng #define

const short int SOME_ADDRESS = 0x0010 

sau đó tôi nhận được lỗi "nhiều khai báo" vì tôi có nhiều tệp .c sử dụng cùng .h. Tôi muốn sử dụng một enum, nhưng điều đó sẽ không làm việc vì nó mặc định để loại số nguyên (đó là 16 bit trên hệ thống của tôi ... và tôi cần phải có quyền kiểm soát tốt hơn các loại).

Tôi nghĩ về việc đặt tất cả các địa chỉ trong cấu trúc ... nhưng tôi không có cách nào (mà tôi biết) thiết lập giá trị mặc định của cá thể của cấu trúc trong tệp tiêu đề (tôi không muốn giả sử rằng một tệp .c cụ thể sử dụng cấu trúc đầu tiên và điền vào nó ở nơi khác .. Tôi thực sự muốn có các hằng số được định nghĩa trong tệp .h)

Nó dường như rất đơn giản khi tôi bắt đầu, nhưng tôi không nhìn thấy một cách tốt để xác định một hằng số ngắn có sẵn trên toàn cầu trong một tập tin tiêu đề ... bất cứ ai biết một cách để làm điều này?

cảm ơn!

Trả lời

23

Khai báo các hằng số trong file header sử dụng extern:

extern const short int SOME_ADDRESS; 

sau đó trong bất kỳ, nhưng chỉ có một, .c tập tin cung cấp các định nghĩa:

const short int SOME_ADDRESS = 0x0010; 
+0

nếu tôi làm điều đó, tôi sẽ không phải biết rằng tệp .c cụ thể đó được gọi trước? hoặc nếu chúng được định nghĩa trên toàn cầu trong tệp .c đó, thì định nghĩa sẽ được thực hiện trước khi bất kỳ hàm nào được gọi? –

+0

Không, không có gì để được gọi để khởi tạo các hằng số và định nghĩa sẽ có mặt trước khi bất cứ điều gì cố gắng sử dụng chúng. Chỉ cần đảm bảo rằng tệp '.o' (hoặc' .obj') của tệp '.c' trong đó các hằng số được xác định được liên kết vào nhị phân cuối cùng. – hmjd

+0

nó hoạt động - cảm ơn !!! –

0

Nếu bạn đang biên soạn với gcc, bạn có thể thêm công tắc -ggdb3, sẽ cho gcc lưu trữ thông tin macro (tức là #define s) để chúng có thể được sử dụng bên trong gdb.

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