2012-02-08 33 views
8

Tôi có nhiều cảm biến 3 trục khác nhau mà tôi đang viết mã thử nghiệm. Trong các tập tin C cho mỗi người trong số họ, tôi có chuỗi char cùng định nghĩa:Cách xác định một chuỗi các ký tự trong tệp tiêu đề?

char axis[3][8] = {"X", "Y", "Z"} 

mà tôi sử dụng khi tôi "cho" Kết quả vòng lặp để in các trục đó là thất bại như thế này:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]); 

Tôi đã suy nghĩ để tiết kiệm một số không gian tôi có thể xác định một chuỗi ký tự chuỗi trong một tập tin tiêu đề để sử dụng trên tất cả các nơi.

Tôi đã thử một số thứ, nhưng dường như tôi không thể nhận được một chuỗi các chuỗi được xác định trong tệp tiêu đề của tôi mà tôi có thể lặp qua để biên dịch.

Trả lời

10

Để tránh lỗi trình liên kết, bạn phải khai báo mảng của mình dưới dạng extern trong tệp tiêu đề, sau đó xác định mảng một lần trong một trong các mô-đun mã của bạn.

Vì vậy, ví dụ:

//myheader.h 
extern const char* axis[3]; 

sau đó trong một mô-đun mã ở đâu đó:

//myfile.c 
const char* axis[3] = { "X", "Y", "Z" }; 
+0

ah có ý nghĩa nhưng có vẻ như âm trầm ... Vì vậy, tệp tiêu đề tôi bao gồm ở mọi nơi trỏ tất cả các tệp C khác vào định nghĩa cục bộ "myfile.c". – user1054210

+0

Vì vậy, mặc dù tôi đã bao gồm các tập tin tiêu đề trong các tập tin c khác tôi nhận được một lỗi biên dịch "undefined refrence". Vì vậy, trong myheader.h tôi có >> extern char * AXIS [3] [8]; và trong myfile.c tôi có >> char * AXIS [3] [8] = {{"X"}, {"Y"}, {"Z"}}; và tôi bao gồm myheader.h trong otherfile.c. Tôi cũng đã thử một vài thủ thuật khác nhưng chúng không đồng bộ hóa. – user1054210

+0

Cái gì khác là sai sau đó bởi vì điều này không làm việc ... những gì sẽ xảy ra nếu bạn lấy vĩ mô ra khỏi phương trình và chỉ đơn giản là cố gắng truy cập vào mảng trong một mô-đun mã bao gồm các tập tin tiêu đề? Thứ hai, nó chỉ nên là 'const char * AXIS [3] = {" X "," Y "," Z "};' vì đây là các chuỗi ký tự chuỗi ... bạn lấy '8' từ đâu? – Jason

19

Nếu bạn phải đặt nó trong một tập tin tiêu đề, sử dụng extern hoặc static:

// option 1 
// .h 
extern char axis[3][8]; 

// .c 
char axis[3][8] = { "X", "Y", "Z" }; 

// option 2 
// .h 
static char axis[3][8] = { "X", "Y", "Z" }; 

Extern nói với trình liên kết rằng có một biến toàn cục có tên là axis được xác định trong một trong các tệp triển khai của chúng tôi (tức là trong một tập tin .c) và tôi cần tham khảo ở đây.

static, mặt khác, cho trình biên dịch ngược lại: Tôi cần có thể xem và sử dụng biến này, nhưng không xuất nó vào trình liên kết, vì vậy nó không thể được tham chiếu bởi extern hoặc nguyên nhân đặt tên xung đột.

2

Đặt này trong tập tin tiêu đề của bạn

extern char axis[3][8]; 

và ghi nhớ điều này một file C:

char axis[3][8] = {"X", "Y", "Z"}; 
2

Thêm phần này vào tiêu đề của bạn:

extern char *axis[]; 

Thêm phần này vào một tệp nguồn trong dự án của bạn:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" }; 
+0

Thực hiện tốt! Tôi sử dụng điều này khi tôi cần tạo một menu 'với số lượng các phần tử không xác định. Nó hoàn hảo bởi vì tại thời gian biên dịch trình biên dịch thiết lập độ dài mảng chính xác, hơn nữa mã có vẻ dễ đọc hơn nhiều. – b3h3m0th

0

Michael Barr (Netrino) khuyên chống lại việc khai báo lưu trữ trong tệp tiêu đề. Tương tự như vậy, tiêu chuẩn mã hóa hệ thống nhúng Netrino không tha thứ cho việc sử dụng lưu trữ bên ngoài trong các tiêu đề.

Tôi thường đồng ý với các nguyên tắc này và tôi đã tìm thấy ý tưởng tốt là lưu trữ bên ngoài vào các tệp C cần đến và chỉ những tệp đó.

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