2012-03-14 13 views
22

Cho đến nay tôi đã có như xa như:Làm thế nào để hiển thị giá trị của một #define tại thời gian biên dịch trong gcc

#define ADEFINE "23" 
#pragma message ("ADEFINE" ADEFINE) 

Những công trình, nhưng những gì nếu ADEFINE không phải là một chuỗi?

#define ADEFINE 23 
#pragma message ("ADEFINE" ADEFINE) 

nguyên nhân:

cảnh báo: bị thay đổi ‘nhắn #pragma’, bỏ qua

Lý tưởng nhất là tôi muốn để có thể đối phó với bất kỳ giá trị, trong đó có xác định.

Trả lời

22

Để hiển thị các macro mà không phải là chuỗi, stringify the macro:

#define STRINGIFY(s) XSTRINGIFY(s) 
#define XSTRINGIFY(s) #s 

#define ADEFINE 23 
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

Nếu bạn có/muốn boost, bạn có thể sử dụng boost stringize để làm điều đó cho bạn:

#include <boost/preprocessor/stringize.hpp> 
#define ADEFINE 23 
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
+0

Vâng, tôi không nghĩ rằng khách hàng của tôi sẽ rất vui khi được thêm vào như một sự phụ thuộc, nhưng điều đó giống như một bằng chứng tồn tại. Có lẽ tôi nên đi và có một cái nhìn tại stringize.hpp –

+4

@JohnLawrenceAspden Tôi cập nhật câu trả lời với cách để làm điều đó mà không cần tăng (hoặc bất kỳ thư viện nào khác). – rob05c

6

Tôi không chắc chắn nếu điều này sẽ làm những gì bạn muốn, nhưng nếu bạn chỉ quan tâm đến điều này để gỡ lỗi các vấn đề vĩ mô thường xuyên (vì vậy nó không phải là một cái gì đó bạn cần hiển thị trong một tin nhắn cho mỗi biên dịch), sau đây có thể làm việc cho bạn. Sử dụng tùy chọn -E -dD của gcc để kết xuất các chỉ thị #define cùng với đầu ra tiền xử lý. Sau đó ống rằng thông qua grep để chỉ xem các dòng bạn muốn:

// test.c 
#include <stdlib.h> 
#include <stdio.h> 
#define ADEFINE "23" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
#undef ADEFINE 
#define ADEFINE 42 
    return 0; 
} 

Lệnh gcc -E -dD -c test.c | grep ADEFINE show:

#define ADEFINE "23" 
#undef ADEFINE 
#define ADEFINE 42