programing

C - 구조물 내부 기능

randomtip 2022. 8. 31. 22:23
반응형

C - 구조물 내부 기능

내부 함수를 할당하려고 합니다.struct지금까지의 코드는 다음과 같습니다.

typedef struct client_t client_t, *pno;
struct client_t
{
    pid_t pid;
    char password[TAM_MAX]; // -> 50 chars
    pno next;
    
    pno AddClient() 

    {
        /* code */
    }
};

int main()
{
    client_t client;

    // code ..

    client.AddClient();
}
**Error**: *client.h:24:2: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token.*

어느 것이 올바른 방법입니까?

직접 실행할 수는 없지만 함수 포인터와 명시적으로 "이" 매개 변수를 전달하여 동일한 작업을 에뮬레이트할 수 있습니다.

typedef struct client_t client_t, *pno;
struct client_t
{
    pid_t pid;
    char password[TAM_MAX]; // -> 50 chars
    pno next;

    pno (*AddClient)(client_t *); 
};

pno client_t_AddClient(client_t *self) { /* code */ }

int main()
{

    client_t client;
    client.AddClient = client_t_AddClient; // probably really done in some init fn

    //code ..

    client.AddClient(&client);

}

하지만 이렇게 한다고 해서 정말 많은 것을 얻을 수 있는 것은 아니라는 것이 밝혀졌습니다.외부 함수를 호출하여 인스턴스를 전달하기만 하면 되기 때문에 이 스타일로 구현되는 C API는 많지 않습니다.

다른 사람들이 지적한 바와 같이, 함수 포인터를 구조 안에 직접 삽입하는 것은 보통 콜백 함수처럼 특별한 목적을 위해 예약됩니다.

가상 메서드 표와 같은 것이 필요할 것입니다.

typedef struct client_ops_t client_ops_t;
typedef struct client_t client_t, *pno;

struct client_t {
    /* ... */
    client_ops_t *ops;
};

struct client_ops_t {
    pno (*AddClient)(client_t *);
    pno (*RemoveClient)(client_t *);
};

pno AddClient (client_t *client) { return client->ops->AddClient(client); }
pno RemoveClient (client_t *client) { return client->ops->RemoveClient(client); }

조작을 추가해도, 그 사이즈는 변경되지 않습니다.client_t구조.이러한 유연성은 다양한 종류의 클라이언트를 정의해야 하는 경우나 사용자가 자신의 클라이언트를client_t조작의 동작을 증강할 수 있습니다.

이러한 구조는 실제 코드에 나타납니다.OpenSSL BIO 계층은 이와 유사하며 UNIX 디바이스 드라이버 인터페이스에도 이와 같은 계층이 있습니다.

이건 어때?

#include <stdio.h>

typedef struct hello {
    int (*someFunction)();
} hello;

int foo() {
    return 0;
}

hello Hello() {
    struct hello aHello;
    aHello.someFunction = &foo;
    return aHello;
}

int main()
{
    struct hello aHello = Hello();
    printf("Print hello: %d\n", aHello.someFunction());

    return 0;
} 

이것은 C++에서만 동작합니다.구조체의 함수는 C의 특징이 아닙니다.

고객도 마찬가지입니다.AddClient(); 호출...이것은 C++와 같은 객체 지향 프로그래밍인 멤버 함수에 대한 호출입니다.

소스를 .cpp 파일로 변환하고 그에 따라 컴파일하고 있는지 확인합니다.

C를 고수할 필요가 있는 경우는, 이하의 코드(일부)가 같습니다.

typedef struct client_t client_t, *pno;
struct client_t
{
        pid_t pid;
        char password[TAM_MAX]; // -> 50 chars
        pno next;

};


pno AddClient(pno *pclient) 
{
    /* code */
}


int main()
{

    client_t client;

    //code ..

    AddClient(client);

}

구조에 따라 코드를 그룹화하려고 합니다.C 그룹화는 파일별로 이루어집니다.모든 함수 및 내부 변수를 헤더 또는 헤더와 c 소스 파일에서 컴파일된 오브젝트 ".o" 파일에 넣습니다.

오브젝트 지향 언어가 아닌 C 프로그램을 위해 오브젝트 지향성을 처음부터 재창조할 필요는 없습니다.

나 이거 전에 본 적 있어.그것은 이상한 일이다.그 중 일부는 표준적인 방법임에도 불구하고 변경하고 싶은 객체를 함수로 전달하는 것을 싫어합니다.

C++는 class 객체가 항상 멤버 함수의 첫 번째 파라미터라는 사실을 숨겼기 때문에 C++를 비난합니다.즉, 오브젝트를 함수에 전달하고 있는 것은 아닌 것 같습니다.

Client.addClient(Client& c); // addClient first parameter is actually 
                             // "this", a pointer to the Client object.

C는 유연하고 지나가는 것을 기준으로 삼을 수 있다.

C 함수는 종종 상태 바이트 또는 int만 반환하며 이는 무시됩니다.당신의 경우 적절한 양식은

 /* add client to struct, return 0 on success */
 err = addClient( container_t  cnt, client_t c);
 if ( err != 0 )
   { 
      fprintf(stderr, "could not add client (%d) \n", err ); 
   }

addClient는 Client.h 또는 Client.c에 있습니다.

구조 포인터를 전달하여 함수 인수로 기능할 수 있습니다.패스 바이 레퍼런스라고 불렀어요.

해당 포인터 내의 항목을 수정하면 다른 항목이 업데이트됩니다.다음과 같이 시도합니다.

typedef struct client_t client_t, *pno;
struct client_t
{
        pid_t pid;
        char password[TAM_MAX]; // -> 50 chars
        pno next;
};

pno AddClient(client_t *client)
{
        /* this will change the original client value */
        client.password = "secret";
}

int main()
{
    client_t client;

    //code ..

    AddClient(&client);
}

언급URL : https://stackoverflow.com/questions/17052443/c-function-inside-struct

반응형