Trước đây mình có đọc code của thầy Paul Varcholik (cựu lập trình viên tại Electronic Art, hiện tại là giảng viên trường Đại Học Florida) dạy về DirectX và OpenGL. Trong lúc đọc code mình thấy có đoạn code như sau:

SHADER_VARIABLE_DEFINITION(BasicEffect, WorldViewProjection)
#define SHADER_VARIABLE_DEFINITION(ShaderProgram, VariableName) \
    VariableShaderProgram::VariableName() const               \
    {                                                           \
        return *m ## VariableName;                              \
    }

Bạn để ý sẽ thấy đoạn có 2 dấu thăng (sharp) liên tiếp, đây chính là ghép chuỗi dùng tiền xử lý. Trong trường hợp này, thầy đã trả về tên một con trỏ mà chỉ bằng cách truyền tên biến vào.

Đây là dựa trên chuẩn C++ 98 chương 16.3.3

Một ví dụ khác:

#include <iostream>

#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()
{
    std::cout << "Stumped?\n";
}

Việc hàm begin() được định nghĩa decode() (cảm ơn Susam Pal đã có một ví dụ khá hay và thú vị) thành chữ main bằng cách ghép đối xứng từng ký tự trong chuỗi "stumped" và "animate" 

Comments


Comments are closed