2012-01-16 34 views
9

Tôi muốn tạo tệp log.c có chứa các hàm info(), debug() và error(). Các chức năng này đang hoạt động mà không cần in tên tệp, số dòng, .. v.v. Vì vậy, khi tôi gọi một trong những chức năng này tôi muốn đổ tên tập tin, số dòng, và tên chức năng của người gọi. Vậy làm cách nào để chúng tôi theo dõi chính xác? Có cách nào để theo dõi lại trên C hoặc, nếu chúng ta sử dụng macro, làm thế nào điều này có thể được thực hiện?In tên tệp, số dòng và tên hàm của chức năng gọi - C Prog

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm

+1

có thể trùng lặp với [số dòng C/C++] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116

+0

@KennyTM: Cảm ơn bạn! Câu trả lời là có. – sura2k

Trả lời

21

Tôi muốn vượt qua các dữ liệu đến các chức năng thông qua các thông số (có thể có được sự giúp đỡ của một macro)

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 

Và để gọi cho họ

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 

Lưu ý: __func__ là C99; gcc, ở chế độ C89 có __FUNCTION__

+0

Có cách nào để tạo các loại hàm này, mà không truyền __FILE __, .. v.v. – sura2k

+8

Có, với macro. Ví dụ, đối với C99 (trong đó có các macro Vĩ mô): '#define INFO (...) thông tin (__ FILE__, __LINE__, __func__, __VA_ARGS __)' – pmg

+0

Cảm ơn! Đó là những gì tôi cần. – sura2k

5

Nếu bạn sử dụng macro, tôi tin rằng bạn có thể thực hiện tác vụ này bằng cách sử dụng __FILE__, __LINE____FUNCTION__. Ví dụ,

#define INFO(msg) \ 
    fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \ 
    fprintf(stderr, "%s", msg); 

Bạn có thể sử dụng chức năng quá, nhưng bạn sẽ cần phải vượt qua trong __FILE__, vv để đảm bảo rằng họ có giá trị đúng.

+1

'gcc -std = gnu99' nói' __LINE__' là số nguyên và cảnh báo về việc truyền nó thành 'char *'. Không nên dòng thứ hai là 'fprintf (stderr," thông tin:% s:% d: ", __FILE__, __LINE__); \ '('% s' được thay thế bằng '% d')? – matec

+0

Đã sửa lỗi! Rò rỉ một số Python cũ ở đó. – Michael

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