afaik, bạn sẽ cần phải nướng thông tin đó vào nhị phân của mình. chỉ cần tạo một hàm trả về sizeof và alignof trong một cấu trúc, hỗ trợ các kiểu mà bạn phải hỗ trợ, sau đó gọi hàm đó (hoặc phương thức lớp) cho thông tin.
Chương trình dưới đây cho bạn biết rằng nhiều nguyên thủy chỉ là một ký tự. Vì vậy, phần lớn việc thực hiện của hàm có thể là một công tắc.
static void test(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
printf("%s : %s\n", NSStringFromSelector(sel).UTF8String, type);
free((void*)type);
}
int main(int argc, char *argv[]) {
@autoreleasepool {
test(@selector(init));
test(@selector(superclass));
test(@selector(isEqual:));
test(@selector(length));
return 0;
}
}
và sau đó bạn có thể sử dụng như là một điểm khởi đầu:
typedef struct t_pair_alignof_sizeof {
size_t align;
size_t size;
} t_pair_alignof_sizeof;
static t_pair_alignof_sizeof MakeAlignOfSizeOf(size_t align, size_t size) {
t_pair_alignof_sizeof ret = {align, size};
return ret;
}
static t_pair_alignof_sizeof test2(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
const size_t length = strlen(type);
if (1U == length) {
switch (type[0]) {
case '@' :
return MakeAlignOfSizeOf(__alignof__(id), sizeof(id));
case '#' :
return MakeAlignOfSizeOf(__alignof__(Class), sizeof(Class));
case 'c' :
return MakeAlignOfSizeOf(__alignof__(signed char), sizeof(signed char));
...
Vì vậy, câu trả lời là: Không có cách nào để thực hiện việc này mà không tự mình triển khai. Chính xác? –
@Tilo Tôi đã thực hiện một số điều ngớ ngẩn với thời gian chạy - không có giải pháp miễn phí mà tôi biết, nhưng giải pháp trong câu trả lời của tôi có thể được triển khai khá dễ dàng nếu bạn biết các loại bạn phải hỗ trợ. Tất nhiên, bạn cũng có thể chờ xem liệu bạn có câu trả lời thích hợp hơn hay không. – justin
@Tilo - đã thêm bản trình diễn cho số – justin