Tôi có một dự án C++ sử dụng trình phân tích cú pháp bison C. Các phân tích cú pháp C sử dụng một cấu trúc của con trỏ hàm để gọi chức năng mà tạo nút AST thích hợp khi tác phẩm được giảm bằng cách bò rừng:C chức năng gọi lại được xác định trong một không gian tên chưa đặt tên?
typedef void Node;
struct Actions {
Node *(*newIntLit)(int val);
Node *(*newAsgnExpr)(Node *left, Node *right);
/* ... */
};
Bây giờ, trong ++ phần C của dự án, tôi điền vào những gợi ý
class AstNode {
/* ... */
};
class IntLit : public AstNode {
/* ... */
};
extern "C" {
Node *newIntLit(int val) {
return (Node*)new IntLit(val);
}
/* ... */
}
Actions createActions() {
Actions a;
a.newIntLit = &newIntLit;
/* ... */
return a;
}
Bây giờ lý do duy nhất tôi đặt chúng trong extern "C"
là bởi vì tôi muốn họ có các quy ước gọi điện C. Nhưng tối ưu, tôi muốn tên của họ vẫn bị xáo trộn. Họ không bao giờ được gọi là by-name từ mã C, vì vậy tên mangling không phải là một vấn đề. Việc khiến chúng bị xáo trộn sẽ tránh xung đột tên, vì một số hành động được gọi là error
và hàm gọi lại C++ có tên xấu như sau để tránh xung đột tên với các mô-đun khác.
extern "C" {
void uglyNameError(char const *str) {
/* ... */
}
/* ... */
}
a.error = &uglyNameError;
tôi tự hỏi liệu nó có thể là có thể bằng cách chỉ đơn thuần đưa ra các loại chức năng C liên kết
extern "C" void fty(char const *str);
namespace {
fty error; /* Declared! But i can i define it with that type!? */
}
Bất kỳ ý tưởng? Tôi đang tìm kiếm các giải pháp Standard-C++.
Bạn không thể biên dịch đầu ra Bison thành mã C++, do đó tránh được vấn đề hoàn toàn? –
@Konrad đồng nghiệp của tôi nói rằng chế độ bison C++ không tốt để làm việc, và vì vậy chúng tôi làm điều đó với C thuần túy và tóm tắt, vì vậy cùng với máy quét tạo nên một thư viện C thuần túy. –