Có một vài cách để làm điều này:
nếu bạn đang làm việc với xâu chỉ, bạn có thể chỉ đơn giản sử dụng chỉ cần sử dụng dây - đặt một chuỗi chữ cái khác làm cho trình biên dịch để ghép chúng .
nếu có thể có những thứ khác ngoài chuỗi ký tự liên quan (ví dụ: bạn đang tạo số nhận dạng mới từ macro) sử dụng toán tử dán mã thông báo preprocessor '##
'. Bạn có thể cũng cần phải sử dụng '#
' 'stringizing điều hành để thực hiện các macro của bạn vào các chuỗi chữ
Một ví dụ về # 1:.
#ifdef __TESTING
#define IV_DOMAIN "domain.org" //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN "test.domain.com" //live testing servers
#else
#define IV_DOMAIN "domain.com" //production
#endif
// Sub-Domain
#define IV_SECURE "secure." IV_DOMAIN //secure.domain.org etc
#define IV_MOBILE "m." IV_DOMAIN
Và như xa như các nhà điều hành dán thẻ đi, tôi không nghĩ rằng hầu hết các câu trả lời gợi ý ted bằng cách sử dụng các nhà điều hành tiền xử lý thẻ preprocessor đã thực sự thử nó - nó có thể được khôn lanh để sử dụng.
Sử dụng câu trả lời mà thường được gợi ý sẽ dẫn đến một lỗi biên dịch khi bạn cố gắng sử dụng IV_SECURE
vĩ mô, bởi vì:
#define IV_SECURE "secure."##IV_DOMAIN
mở rộng để:
"secure"domain.org
Bạn có thể muốn thử để sử dụng toán tử '
# `'' stringizing ':
#define IV_SECURE "secure." #IV_DOMAIN
Nhưng tha t sẽ không hoạt động vì nó chỉ hoạt động trên các đối số macro - không chỉ bất kỳ macro cũ nào.
một điều cần lưu ý khi bạn sử dụng toán tử tiền xử lý ('##') hoặc xâu chuỗi ('#') là bạn phải sử dụng thêm một mức không giới hạn để chúng hoạt động bình thường trong tất cả trường hợp.
Nếu bạn không làm điều này và các mặt hàng truyền cho các nhà điều hành mã thông báo dán là macro bản thân, bạn sẽ nhận được kết quả mà có lẽ không phải những gì bạn muốn:
#include <stdio.h>
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)
#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x
#define SOME_MACRO function_name
int main()
{
printf("buggy results:\n");
printf("%s\n", STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(BAD_PASTE(SOME_MACRO, __LINE__)));
printf("%s\n", BAD_STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
printf("\n" "desired result:\n");
printf("%s\n", STRINGIFY(PASTE(SOME_MACRO, __LINE__)));
}
Sản lượng:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
Vì vậy, sử dụng ban đầu IV_DOMAIN
định nghĩa của bạn và các macro utilty từ trên cao, bạn có thể làm điều này để có được những gì bạn muốn:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
Bản sao có thể có của [Chuyển đổi mã thông báo tiền xử lý thành chuỗi] (http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string) –