2012-03-05 37 views
5

Tôi có một vài macro thường được sử dụng phổ biến cần thiết chỉ trong mỗi tệp C tôi viết. Hiện tại tôi đang sao chép chúng vào mỗi tệp mà tôi cần chúng. Đây có thể là một ý tưởng tồi bởi vì cuối cùng tôi sẽ cần phải thay đổi một trong số chúng và sau đó tôi sẽ kết thúc với các macro không nhất quán giữa các tệp.Tái sử dụng macro C trong một số tệp

Có cách nào về cơ bản tạo tệp tiêu đề cho macro không? Tôi đã cố gắng làm cho một tiêu đề với tất cả các macro của tôi trong đó và bao gồm điều đó, nhưng tôi vẫn nhận được cảnh báo trình biên dịch.

CẬP NHẬT: Cảnh báo cụ thể mà tôi nhận được là khai báo tiềm ẩn các hàm như V4 từ ví dụ thứ hai.

Một ví dụ:

//file1.c 
#define COMMON_NUMBER 1 

//file2.c 
#define COMMON_NUMBER 1 

//... 

//fileN.c 
#define COMMON_NUMBER 1 

//Oh wait, it should have been 2 all along..... *facepalm* 

Một ví dụ tốt hơn:

//file1.c 
#include "usefulmacros.h" 

char* prog; 
int optv; 

int main(){ 
    prog = strdup(argv[0]);  
    optv = 4;   // This would be parsed from # of "-v" in argv[] 
    return 0; 
} 

void functionA(){ 
    int dumberror = 1; 
    V4("This is a fairly verbose error: %d",dumberror); 
} 

//file2.c 
#include "usefulemacros.h" 
extern char* prog; 
extern int optv; 

void functionB(){ 
    int differror = 2; 
    V4("This is a different error: %d",differror); 
} 

//usefulmacros.h 
#ifndef USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
+6

Những loại cảnh báo bạn đang nói về đây? Chúng ta sẽ đoán? –

+1

Trong trường hợp bạn chưa từng nghe, có rất ít công việc mà macro là công cụ tốt nhất và chúng có thể gây ra nhiều vấn đề. Ví dụ, 'COMMON_NUMBER' này có thể là một biến toàn cầu' const' (hoặc tốt hơn). – Beta

+0

@JeffMercado: Tôi đã cập nhật câu hỏi của mình với ví dụ tốt hơn minh họa điều đang xảy ra theo nghĩa cụ thể hơn. – Huckle

Trả lời

6
#ifndef COMMON_INCLUDE_FILE 
#define COMMON_INCLUDE_FILE 

#define COMMON_NUMBER 1 
#define OTHER_COMMON 2 

#endif 

Trong C, nơi macro là phổ biến hơn một chút so với C++ mà bạn muốn làm điều đó với một thế giới tĩnh, cơ chế trên là khá phổ biến. Bạn đặt bao gồm bảo vệ xung quanh cơ thể của tập tin, và xác định commons của bạn có .. Đây là cơ bản những gì config.h kết thúc lên được với autoconf .. Vì vậy, không ai có thể nói đây không phải là một cơ chế tiêu chuẩn cho mã C.

Chỉ cần bao gồm common.h trong bất kỳ tệp nào cần nó, thực hiện giao dịch.

+0

Tôi biết cấu trúC# idndef/# define/# endif, tôi đã thêm nhiều chi tiết hơn vào câu hỏi của mình. – Huckle

+0

Nó vẫn là câu trả lời giống như những gì tôi đã đăng, lưu ý rằng câu hỏi của bạn _still_ thiếu '#ifndef COMMON_INCLUDE_FILE \ n #define COMMON_INCLUDE_FILE \ n \ n #endif \ n'. Điều đó đặc biệt là bảo vệ đầu trang ngăn không cho việc bao gồm của bạn bị xử lý trước nhiều lần (và là nguyên nhân của các lỗi định nghĩa trùng lặp của bạn .. Trên 'bao gồm' tiếp theo, nếu COMMON_INCLUDE_FILE được xác định, nó sẽ không tái xử lý nó. – synthesizerpatel

2

Bạn chắc chắn nên đặt macro phổ biến của mình trong một tiêu đề cho toàn bộ dự án của bạn: sao chép mã là điều nguy hiểm chi phí bảo trì của bạn đi qua mái nhà.

Cảnh báo mà bạn thấy có thể phải làm với việc bao gồm cùng một tiêu đề nhiều lần. Bạn cần sử dụng include guards để tránh chúng.

EDIT (để đáp ứng với bản cập nhật câu hỏi)

thực hiện của bạn về bao gồm bảo vệ là mất tích #define USEFULMACROS. Nó phải là như sau:

//usefulmacros.h 
#ifndef USEFULMACROS 
#define USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
0

Bạn kiểm tra định nghĩa macro USEFULMACROS với #ifndef nhưng bạn không xác định nó ở bất kỳ đâu.

Bạn phải thêm dòng

#define USEFULMACROS 

sau

#ifndef USEFULMACROS 
Các vấn đề liên quan