2012-12-05 27 views
5

Tôi đang sử dụng mã sau trong tệp tạo tệp để truy cập biến VENDOR_NAME từ tệp CPP.Sử dụng biến chuỗi tạo tệp trong tệp CPP

EXTRA_DEFINE += -DVENDOR_NAME=$(VENDOR_NAME) VENDOR_NAME chứa một chuỗi.

Trong tệp cpp của tôi khi tôi cố gắng sử dụng biến này, tôi nhận được lỗi như được đưa ra dưới đây.

cout << VENDOR_NAME;

Feature1.cpp.bak.cpp:8: 'Default_Vendor' không khai báo (lần đầu tiên sử dụng chức năng này) Feature1.cpp.bak.cpp:8: (Mỗi định danh chưa được khai báo là báo chỉ một lần cho

Tôi đoán đây là vì chuỗi của tôi không chứa dấu ngoặc kép và trình biên dịch là xem xét nội dung của VENDOR_NAME dưới dạng biến.

Làm cách nào để nhận biến này dưới dạng chuỗi trong tệp CPP của tôi để tôi có thể sử dụng nó như tôi đã #define chỉnh sửa?

Cảm ơn ...

Trả lời

10

Makefile của bạn sẽ tạo dòng lệnh cho trình biên dịch. Vấn đề phát sinh ở đây là nếu bạn chỉ cần đưa giá trị trong dấu ngoặc kép:

EXTRA_DEFINE += -DVENDOR_NAME="$(VENDOR_NAME)" 

... vỏ sẽ thấy có dấu ngoặc kép như chỉ đơn giản là xác định phạm vi một đối số dòng lệnh, vì vậy nó có thể sẽ tước chúng (mặc dù nó có thể phụ thuộc vào trình bao bạn đang sử dụng). Để ngăn chặn điều đó, bạn sẽ muốn tạo ra tranh cãi với dấu ngoặc kép thoát:

EXTRA_DEFINE += -DVENDOR_NAME="\"$(VENDOR_NAME)\"" 

Tôi nghĩ rằng hầu hết các vỏ điển hình, ít nhất là cho Windows và Linux, sẽ chấp nhận một back-slash như một lối thoát để bảo tồn báo giá, nhưng tôi chắc chắn có ít nhất một xung quanh mà bạn sẽ phải làm các trích dẫn khác nhau.

+0

Đó là thiếu một mức độ mở rộng vĩ mô ... khéo léo – Potatoswatter

+0

@Potatoswatter: Không còn nữa! :-) –

+0

@Jerry Quan tài: Cảm ơn bạn. Điều này là quá đủ để tiết kiệm trong ngày .. Tạm biệt các macro :) – NeonGlow

3

Sử dụng bộ tiền xử lý để biến nó thành chuỗi.

#define stringify(x) stringify_literal(x) 
#define stringify_literal(x) # x 

std::cout << stringify(VENDOR_NAME); 

Cho một hỗ trợ tiền xử lý cho các macro variadic (chính thức C++ 11, trong thực tế có sẵn lâu hơn nữa), VENDOR_NAME có thể bao gồm một dấu phẩy:

#define stringify(...) stringify_literal(__VA_ARGS__) 
#define stringify_literal(...) # __VA_ARGS__ 

std::cout << stringify(VENDOR_NAME); 
+1

Có thể có vấn đề nếu 'VENDOR_NAME' chứa dấu phẩy (ví dụ:" Foo, Inc. "). Có lẽ tốt nhất để đối phó với trích dẫn trong makefile chính nó. – jamesdlin

+0

@Potatoswatter: Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Nó sẽ hữu ích hơn nếu tôi có thể làm điều này trong việc tạo tập tin. Làm ơn để tôi biết nếu bạn có thể giúp. – NeonGlow

+0

@jamesdin: Cảm ơn bạn đã chỉ ra. Bạn có thể giúp tôi thêm về cách thực hiện điều này không? – NeonGlow

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