2009-07-30 33 views
35

Có thể in ra giá trị của biến tiền xử lý trong số C không? Ví dụ, những gì tôi có ngay bây giờ là:Có thể in biến tiền xử lý trong C?

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR is greater than 10 
#endif 

Nhưng những gì tôi muốn làm là:

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR=%PP_VAR% 
#endif 

là một cái gì đó như thể này trong C?

Trả lời

41

Bạn có thể in ra giá trị của một biến Preprocessor dưới visual studio. Sau đây in ra giá trị của _MSC_VER:

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 

#pragma message(STRING(_MSC_VER)) 

Bạn không chắc chắn về tiêu chuẩn này.

+2

Không chuẩn, nhưng GCC, MSVC, CLANG ... (có thể những người khác cũng hỗ trợ nó) – ideasman42

0

Vâng, những gì bạn đang làm thực sự không chuẩn. Thứ nhất, chỉ thị "#warning" hoặc "#warn" không phải là tiêu chuẩn. Thứ hai, khi sử dụng tiền xử lý, dòng phải bắt đầu bằng biểu tượng pound, mà không cần bất kỳ dấu cách:

 
#ifdef BLAH1 
# define BLAH2 // OK, because pound is at the very left. 
#endif 

#ifdef BLAH3 
    #define BLAH4 // Works on many compilers, but is non-standard. 
#endif 

Vì bạn đang sử dụng một phần mở rộng phi tiêu chuẩn, bạn sẽ cần phải tìm kiếm các tài liệu hướng dẫn của tiền xử lý đặc biệt/Trình biên dịch mà bạn đang sử dụng để xem những gì nó nói về "#warning".

+5

điểm thứ hai của bạn là không đúng - C89 dỡ bỏ hạn chế đó. # Phải là biểu tượng đầu tiên trên dòng, nhưng nó có thể được đặt trước bởi khoảng trắng (nhưng không phải bởi các chú thích). –

+0

Cảm ơn. Tôi không thể tin rằng tôi vẫn sống trong thời đại đen tối. Bạn có thể chỉ cho tôi tài liệu liên quan cho điều đó không? –

+0

Rất tiếc. Tôi đến sau trận đấu hơn là tôi nghĩ - tôi chưa bao giờ biết về hạn chế đó. –

2

Sử dụng tiền xử lý token dán hành: ## TOKEN_NAME

Như đã đề cập trước đó, các chỉ thị tiền xử lý bạn đang sử dụng là không đúng tiêu chuẩn, do đó, YMMV.

3

Nhiều trình biên dịch C hỗ trợ #warning (nhưng không được xác định theo tiêu chuẩn C).

Tuy nhiên, GCC ít nhất không thực hiện xử lý trước trên dữ liệu sau, có nghĩa là khó có thể thấy giá trị của biến.

#define PP_VAR 123 
#warning "Value of PP_VAR = " PP_VAR 
#warning "Value of PP_VAR = " #PP_VAR 
#warning "Value of PP_VAR = " ##PP_VAR 

GCC sản xuất:

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR 
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR 
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR 
+7

Vì vậy, khi bạn nói "thật khó để thấy giá trị của một biến", điều bạn thực sự muốn nói là bạn KHÔNG THỂ thấy nó. – Nick

+0

Khoảng - có; Tôi đã không làm việc ra một cách để nhìn thấy nó, mà không giống như "không có cách nào để nhìn thấy nó". –

+0

Tôi nghĩ rằng *** đây là những gì tôi đang cố gắng làm .... Tôi muốn biết thư viện thời gian chạy là gì định nghĩa 'SSIZE_MAX' thành một chuỗi (như' 0', 'INT_MAX' hoặc' LONG_MAX '), nhưng chuỗi chỉ trả về' SSIZE_MAX' (phía bên tay trái của định nghĩa). – jww

8

này làm việc với GCC 4.4.3:

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX) 

sản lượng:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017 
Các vấn đề liên quan