구조물의 함수
구조물에 함수가 포함될 수 있습니까?
아니요, 하지만 함수 포인터를 포함할 수 있습니다.
만약 당신의 의도가 C에서 어떤 형태로든 다형성을 하려는 것이라면, 예, 다음과 같이 할 수 있습니다.
typedef struct {
int (*open)(void *self, char *fspec);
int (*close)(void *self);
int (*read)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
int (*write)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
// And data goes here.
} tCommClass;
그typedef
위는 제가 범용 통신 라이브러리를 위해 만든 구조물을 위한 것이었습니다.변수를 초기화하기 위해 다음을 수행합니다.
tCommClass *makeCommTcp (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &tcpOpen;
comm->close = &tcpOpen;
comm->read = &tcpOpen;
comm->write = &tcpWrite;
}
return comm;
}
tCommClass *makeCommSna (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &snaOpen;
comm->close = &snaOpen;
comm->read = &snaOpen;
comm->write = &snaWrite;
}
return comm;
}
tCommClass *commTcp = makeCommTcp();
tCommClass *commSna = makeCommSna();
그런 다음 함수를 호출하면 다음과 같습니다.
// Pass commTcp as first params so we have a self/this variable
// for accessing other functions and data area of object.
int stat = (commTcp->open)(commTcp, "bigiron.box.com:5000");
이러한 방식으로 단일 유형을 TCP, SNA, RS232 또는 심지어는 동일한 인터페이스를 가진 반송파 피전에도 사용할 수 있습니다.
edit 'data type' 사용으로 모호성 해소
C에는 없습니다.struct
types에는 데이터만 포함할 수 있습니다.
ISO C99 표준의 섹션 6.7.2.1부터.
구조 또는 유니언은 불완전하거나 함수형을 가지는 부재(따라서 구조는 자신의 인스턴스를 포함하지 않지만 자신의 인스턴스에 대한 포인터를 포함할 수 있음)를 포함할 수 없습니다. 단, 둘 이상의 명명된 부재를 가지는 구조의 마지막 부재가 불완전한 배열형을 가질 수 있음을 제외하고는, 이러한 구조(그리고 다음을 포함하는 유니언)를 포함할 수 있음ibibly recursive, 그러한 구조인 부재)는 구조의 부재 또는 배열의 요소가 되어서는 안 됩니다.
아니, 너는 할 수 없어.구조물은 함수에 대한 선언을 포함할 수 없지만 함수에 대한 정의는 포함할 수 있습니다.구조체는 데이터 형식, 포인터, 다른 함수에 대한 포인터만 포함할 수 있습니다.함수의 포인터를 만든 다음 구조에서 액세스할 수 있습니다.
#include<iostream>
#include<cstring>
using namespace std;
struct full_name
{
char *fname;
char *lname;
void (*show)(char *,char*);
};
void show(char *a1,char * a2)
{
cout<<a1<<"-"<<a2<<endl;
}
int main()
{
struct full_name loki;
loki.fname="Mohit";
loki.lname="Dabas";
loki.show=show;
loki.show(loki.fname,loki.lname);
return 0;
}
C에서는 함수 포인터가 아닌 데이터 값에 구조를 포함할 수 있습니다.C에서는 허용되지 않지만 gcc로 확인하면 말 그대로 다음과 같은 것들이 잘 작동합니다.
enter code here
#include <stdio.h>
struct st_func_ptr{
int data;
int (*callback) ();
};
int cb(){
printf(" Inside the call back \n");
return 0;
}
int main() {
struct st_func_ptr sfp = {10, cb};
printf("return value = %d \n",sfp.callback());
printf(" Inside main\n");
return 0;
}
그래서 혼란스럽습니다...
괜찮아요.리눅스 커널 코드에는 함수를 포함하는 구조물들이 많이 있습니다.예를 들어:
/*
* The type of device, "struct device" is embedded in. A class
* or bus can contain devices of different types
* like "partitions" and "disks", "mouse" and "event".
* This identifies the device type and carries type-specific
* information, equivalent to the kobj_type of a kobject.
* If "name" is specified, the uevent will contain it in
* the DEVTYPE variable.
*/
struct device_type {
const char *name;
struct attribute_group **groups;
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
void (*release)(struct device *dev);
int (*suspend)(struct device * dev, pm_message_t state);
int (*resume)(struct device * dev);
};
예, 함수를 선언할 수 있으며 함수 정의는 허용되지 않으며 함수 포인터여야 합니다.
C99 태그 구조를 기반으로 합니다.
로케시 5세
그들은 할 수 있지만, 일반적인 C 프로그래밍에는 본질적인 이점이 없습니다.
C에서는 어쨌든 모든 함수가 전역 공간에 있기 때문에 함수에 집어넣으면 어떤 정보도 숨기지 않습니다. 팍스디아블로의 예는 함수를 구조체로 구성하는 방법이지만, 함수를 사용하려면 어쨌든 각각의 함수를 역참조해야 한다는 것을 알아야 합니다.
C의 표준 조직 구조는 헤더에 인터페이스가 있고 소스에 구현된 파일입니다.
그것이 libc가 수행되는 방식이고 거의 모든 C 라이브러리가 수행되는 방식입니다.
Moder C 컴파일러를 사용하면 동일한 소스 파일에 함수를 정의하고 구현할 수 있으며, 헤더 파일에 정적 함수를 구현할 수도 있습니다.이것은 불행하게도 무엇이 어디로 가는지에 대한 혼동으로 이어지기 때문에 구조에 함수를 주입하는 것, 헤더가 없는 소스 전용 프로그램 등과 같은 특이한 해결책을 얻을 수 있습니다.그렇게 하면 인터페이스와 구현을 분리할 수 있는 이점을 잃게 됩니다.
언급URL : https://stackoverflow.com/questions/4222661/functions-in-structure
'programing' 카테고리의 다른 글
a에서 jQuery Change 이벤트a에서 jQuery Change 이벤트요소 - 이전 값을 유지할 수 있는 방법이 있습니까?요소 - 이전 값을 유지할 수 있는 방법이 있습니까? (0) | 2023.10.23 |
---|---|
브라우저에 마우스가 없고 터치 전용임을 감지 (0) | 2023.10.23 |
NSS 문자열을 설정 길이로 자르는 방법은 무엇입니까? (0) | 2023.10.23 |
Wordpress 사이트에 대한 도메인 마스킹이 있는 htaccess 리디렉션이 작동하지 않습니다. (0) | 2023.10.23 |
A1에서 실제 사용한 셀까지의 범위를 반환합니다. (0) | 2023.10.23 |