0

私はまったく新しいものObjective Cで、それを使用して をラップしようとしていC-libraryます。main.m wrap.mとファイルがありwrap.hます。インクルードしたヘッダーファイルと@interfaceソースファイルに集めた@implementationものから、それぞれに何をインクルードすればよいのかよくわかりません。現在、私のメインファイルは次のとおりです。

int copy_data(struct archive *ar, struct archive *aw) {

    for (;;) {
        const void *buff;
        size_t size;
        off_t offset;

        int r = archive_read_data_block(ar, &buff, &size, &offset);
        if (r == ARCHIVE_EOF)
            return (ARCHIVE_OK);

        archive_write_data_block(aw, buff, size, offset);
    }
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        struct archive *a;
        struct archive *ext;
        struct archive_entry *entry;
        int flags;
        int r;

        /* Select which attributes we want to restore. */
        flags = ARCHIVE_EXTRACT_TIME;
        flags |= ARCHIVE_EXTRACT_PERM;
        flags |= ARCHIVE_EXTRACT_ACL;
        flags |= ARCHIVE_EXTRACT_FFLAGS;

        a = archive_read_new();
        archive_read_support_format_all(a);
        archive_read_support_compression_all(a);
        ext = archive_write_disk_new();
        archive_write_disk_set_options(ext, flags);
        archive_write_disk_set_standard_lookup(ext);
        r = archive_read_open_filename(a, argv[1], 10240);

        for (;;) {
            r = archive_read_next_header(a, &entry);
            if (r == ARCHIVE_EOF)
                break;

            r = archive_write_header(ext, entry);
            if (archive_entry_size(entry) > 0) {
                copy_data(a, ext);
            }

            archive_write_finish_entry(ext);
        }
        archive_read_close(a);
        archive_read_free(a);
        archive_write_close(ext);
        archive_write_free(ext);
        NSLog(@"No Issues");

    }
    return 0;
}

これまでのところ、wrap.hファイルに入っているのは次のとおりです。

typedef struct{
int *a;
int *ext;

}archive;

@interface main : NSObject

@property int flags;
@property int r;

それが私がしなければならないことに近いかどうかはわかりません。また、ARCHIVE_EXTRACT宣言されていない識別子であり、wrap.hファイルにも入力する必要があるとエラーが表示されますが、その方法がわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

0

Objectivec ソリューションに実際に興味がある場合は、Michael Dautermann の指示に従って新しいコマンド ライン プロジェクトを開始しますが、Type C の代わりに Foundation オプションを使用します。これにより、動作するメイン (通常の c 関数のみ) が得られます。次に、new->objective c class を選択して、wrap.h/wrap.m を作成します。wrap.h では、独自の objectc パブリック ラッパー メソッドをほぼ独占的に宣言します。wrap.m では、ラップしたいものをインポートし、ラッパー関数を定義します。

//
//  main.m
//

#import <Foundation/Foundation.h>
#import "wrap.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        [wrap wrappedStuff];

    }
    return 0;
}

//
//  wrap.h
//


----------


#import <Foundation/Foundation.h>


@interface wrap : NSObject
+ (void)wrappedStuff;
@end



//
//  wrap.m
//

#import "wrap.h"
#include "WhatImWrapping.h"

@implementation wrap

int copy_data(struct archive *ar, struct archive *aw) {

    for (;;) {
        const void *buff;
        size_t size;
        off_t offset;

        int r = archive_read_data_block(ar, &buff, &size, &offset);
        if (r == ARCHIVE_EOF)
            return (ARCHIVE_OK);

        archive_write_data_block(aw, buff, size, offset);
    }
}

+ (void)wrappedStuff
{
    struct archive *a;
    struct archive *ext;
    struct archive_entry *entry;
    int flags;
    int r;

    /* Select which attributes we want to restore. */
    flags = ARCHIVE_EXTRACT_TIME;
    flags |= ARCHIVE_EXTRACT_PERM;
    flags |= ARCHIVE_EXTRACT_ACL;
    flags |= ARCHIVE_EXTRACT_FFLAGS;

    a = archive_read_new();
    archive_read_support_format_all(a);
    archive_read_support_compression_all(a);
    ext = archive_write_disk_new();
    archive_write_disk_set_options(ext, flags);
    archive_write_disk_set_standard_lookup(ext);
    r = archive_read_open_filename(a, argv[1], 10240);

    for (;;) {
        r = archive_read_next_header(a, &entry);
        if (r == ARCHIVE_EOF)
            break;

        r = archive_write_header(ext, entry);
        if (archive_entry_size(entry) > 0) {
            copy_data(a, ext);
        }

        archive_write_finish_entry(ext);
    }
    archive_read_close(a);
    archive_read_free(a);
    archive_write_close(ext);
    archive_write_free(ext);
    NSLog(@"No Issues");
}
@end
于 2013-09-28T19:00:32.683 に答える
0

CommandLineTool テンプレートを使用して Xcode でプロジェクトを開始する場合、言語を「C」または「C++」に選択できるため、Objective-C をいじる必要はまったくありません。

Cでプロジェクトを行うことができます

main.c はここのファイルです

現在持っている .h ファイルについては、" " に対して " @property" または " " を実行しないでください。" " は C スタイルの関数であり、Objective-C のものではありません。@interfacemainmain

于 2013-09-28T18:37:13.647 に答える