Vì vậy, giống như những người khác nói, không, bạn không thể có # bao gồm các câu lệnh bên trong macro, vì trình xử lý trước chỉ thực hiện một lần. Tuy nhiên, bạn có thể làm cho bộ tiền xử lý làm cơ bản cùng một điều với một mẹo gnarly tôi thấy mình sử dụng gần đây.
Nhận ra rằng các chỉ thị tiền xử lý sẽ không thực hiện bất kỳ điều gì bên trong macro, tuy nhiên, chúng sẽ làm điều gì đó trong tệp. Vì vậy, bạn có thể dính một khối mã bạn muốn biến đổi thành một tệp, suy nghĩ về nó như một định nghĩa macro (với các phần có thể được thay đổi bởi các macro khác), và sau đó #include tệp macro giả này ở nhiều nơi khác nhau chắc chắn nó không có bảo vệ!). Nó không hoạt động giống như macro, nhưng nó có thể đạt được một số kết quả tương tự như macro, vì #include về cơ bản chỉ đổ nội dung của một tệp vào một tệp khác.
Ví dụ: hãy cân nhắc bao gồm nhiều tiêu đề được đặt tên tương tự có trong nhóm. Đó là tẻ nhạt để viết tất cả chúng ra, hoặc thậm chí chúng được tự động tạo ra. Bạn một phần có thể tự động bao gồm họ bằng cách làm một cái gì đó như thế này:
Helper macro tiêu đề:
/* tools.hpp */
#ifndef __TOOLS_HPP__
#def __TOOLS_HPP__
// Macro for adding quotes
#define STRINGIFY(X) STRINGIFY2(X)
#define STRINGIFY2(X) #X
// Macros for concatenating tokens
#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y
#define CAT_2 CAT
#define CAT_3(X,Y,Z) CAT(X,CAT(Y,Z))
#define CAT_4(A,X,Y,Z) CAT(A,CAT_3(X,Y,Z))
// etc...
#endif
tập tin Pseudo-vĩ mô
/* pseudomacro.hpp */
#include "tools.hpp"
// NO INCLUDE GUARD ON PURPOSE
// Note especially FOO, which we can #define before #include-ing this file,
// in order to alter which files it will in turn #include.
// FOO fulfils the role of "parameter" in this pseudo-macro.
#define INCLUDE_FILE(HEAD,TAIL) STRINGIFY(CAT_3(HEAD,FOO,TAIL))
#include INCLUDE_FILE(head1,tail1.hpp) // expands to #head1FOOtail1.hpp
#include INCLUDE_FILE(head2,tail2.hpp)
#include INCLUDE_FILE(head3,tail3.hpp)
#include INCLUDE_FILE(head4,tail4.hpp)
// etc..
#undef INCLUDE_FILE
tập tin Nguồn
/* mainfile.cpp */
// Here we automate the including of groups of similarly named files
#define FOO _groupA_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupA_tail1.hpp"
// #include "head2_groupA_tail2.hpp"
// #include "head3_groupA_tail3.hpp"
// #include "head4_groupA_tail4.hpp"
#undef FOO
#define FOO _groupB_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupB_tail1.hpp"
// #include "head2_groupB_tail2.hpp"
// #include "head3_groupB_tail3.hpp"
// #include "head4_groupB_tail4.hpp"
#undef FOO
#define FOO _groupC_
#include "pseudomacro.hpp"
#undef FOO
// etc.
Những bao gồm thể ngay cả ở giữa các khối mã bạn muốn lặp lại (với FOO thay đổi), như là một swer by Bing Jian yêu cầu: macro definition containing #include directive
Tôi chưa sử dụng thủ thuật này một cách rộng rãi, nhưng công việc của tôi đã hoàn thành. Nó rõ ràng có thể được mở rộng để có nhiều "tham số" khi cần thiết, và bạn có thể chạy bất kỳ lệnh tiền xử lý nào bạn thích trong đó, cộng với tạo ra mã thực tế. Bạn không thể sử dụng thứ mà nó tạo ra làm đầu vào vào một macro khác, giống như bạn có thể sử dụng với các macro thông thường, vì bạn không thể dính vào phần bên trong macro. Nhưng nó có thể đi vào bên trong một macro giả khác :).
Những người khác có thể có một số nhận xét về các giới hạn khác và những gì có thể xảy ra sai :).
Bạn có lẽ nên xem xét các mẫu (như đề xuất stbuton). Bạn chắc chắn sẽ tìm cách tránh việc phải làm điều đó. –
là một quy tắc chung, bạn có thể đặt tất cả #include statement của bạn vào cùng một vị trí (thường là trên cùng). nó làm cho việc duy trì và gỡ lỗi mã ALOT của bạn đơn giản hơn. – helloandre
Tôi có một cách hơi điên về làm những gì bạn muốn (sử dụng bộ tiền xử lý); xem câu trả lời của tôi :) http://stackoverflow.com/a/27830271/1447953 –