## (hàm băm kép) làm gì trong chỉ thị tiền xử lý?


91
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

Dòng trên là lấy từ Unreal 4, và tôi biết tôi có thể hỏi nó trên các diễn đàn không có thật, nhưng tôi nghĩ đây là một câu hỏi C ++ chung cần được hỏi ở đây.

Tôi hiểu dòng đầu tiên xác định một macro, tuy nhiên tôi không thông thạo về những trò tai quái trong tiền xử lý trong C ++ và vì vậy tôi bị lạc ở đó. Logic cho tôi biết dấu gạch chéo ngược có nghĩa là khai báo tiếp tục ở dòng tiếp theo.

FThreadSafeStaticStat trông hơi giống một mẫu, nhưng có # đang diễn ra trong đó và một cú pháp mà tôi chưa từng thấy trước đây trong C ++

Ai đó có thể cho tôi biết điều này có nghĩa là gì? Tôi hiểu rằng bạn có thể không có quyền truy cập vào Unreal 4, nhưng đó chỉ là cú pháp mà tôi không hiểu.


6
Bạn có thể đọc về toán tử ## trên cppreference , trong số những thứ khác
Cubbi

1
##is / có thể được gọi là toán tử nối.
dyp

1
Ồ, khá tuyệt! Nó giải thích khá nhiều, cảm ơn. Nhưng tại sao từ khóa struct lại được sử dụng? Điểm mấu trông giống như một định nghĩa biến
DavidColson

1
Phần structgiới thiệu một bộ chỉ định kiểu phức tạp theo như tôi có thể nói.
dyp

2
Tên chính thức là "toán tử dán mã thông báo" vì nó kết hợp hai mã thông báo tiền xử lý để tạo ra một mã thông báo khác. Lưu ý rằng nó chỉ hợp lệ nếu kết quả là một mã thông báo tiền xử lý hợp lệ, ví dụ như bạn không thể thực + ## 3hiện +3. (Nhưng tất nhiên bạn có thể làm được + 3, không cần người điều hành)
MM

Câu trả lời:


175

## là toán tử tiền xử lý để nối.

Vì vậy, nếu bạn sử dụng

DEFINE_STAT(foo)

bất kỳ nơi nào trong mã, nó được thay thế bằng

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

trước khi mã của bạn được biên dịch.

Đây là một ví dụ khác từ một bài đăng trên blog của tôi để giải thích thêm về điều này.

#include <stdio.h>

#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Stumped?\n");
}

Chương trình này sẽ biên dịch và thực thi thành công, và tạo ra kết quả sau:

Stumped?

Khi bộ tiền xử lý được gọi trên mã này,

  • begin được thay thế bằng decode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) được thay thế bằng m ## a ## i ## n
  • m ## a ## i ## n được thay thế bằng main

Do đó hiệu quả, begin()được thay thế bằng main().


8
Tôi đã không mong đợi phải suy nghĩ nhiều để tìm hiểu hành vi của ##, nhưng tôi đoán bây giờ tôi sẽ không bao giờ quên nó? Vì vậy, cảm ơn.
NicoBerrogranty,

2
Tôi mất một giây để theo dõi nó, nhưng đây là một câu trả lời tuyệt vời cho câu hỏi. Cảm ơn.
n00dle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.