programing

C의 인수 목록에서 ...은 무엇을 의미합니까?

cafebook 2023. 8. 16. 22:37
반응형

C의 인수 목록에서 ...은 무엇을 의미합니까?

저는 다음 함수 서명을 우연히 발견했고 이것이 ( 생략 부호, 또는 )인지) 궁금했습니다."..." 일종의 다형성인가요?

#include <fcntl.h>
int fcntl(int fd, int cmd, ... );

잘 부탁드립니다.

변수 인수 목록입니다.

그것은 변수 함수입니다.자세한 내용은 stdarg.h를 참조하십시오.

...는 다른 주석자가 이미 언급한 것처럼 이 함수에 임의의 수의 인수를 전달할 수 있음을 의미합니다.선택적 인수가 입력되지 않았기 때문에 컴파일러는 유형을 확인할 수 없으며 모든 유형의 인수를 기술적으로 전달할 수 있습니다.

그렇다면 이것을 사용하여 어떤 종류의 다형성 함수를 구현할 수 있다는 것을 의미합니까? (즉, 인수의 유형에 따라 어떤 연산을 수행하는 함수)

아니요.

이렇게 할 수 없는 이유는 런타임에 전달된 인수 유형을 검사할 수 없기 때문입니다.변수 인수 목록의 함수 읽기는 수신할 선택적 인수의 유형을 이미 알고 있어야 합니다.

수 인 즉, 유임즉수형인취하함의수있는수어야할의수를의의임의의,▁of즉▁in함▁that(,printf의 형식은 전달됩니다.), " 는 인수의 형식입니다.즉, 호출자는 호출할 때마다 전달할 유형을 지정해야 하며, 다형성 함수의 이점을 제거합니다(발신자도 유형을 알 필요가 없습니다).

비교:

// Ideal invocation
x = multiply(number_a, number_b)
y = multiply(matrix_a, matrix_b)

// Standard C invocation
x = multiply_number(number_a, number_b)
y = multiply_matrix(matrix_a, matrix_b)

// Simulated "polymorphism" with varargs
x = multiply(T_NUMBER, number_a, number_b)
y = multiply(T_MATRIX, matrix_a, matrix_b)

vargs 함수가 올바른 작업을 수행하기 전에 유형을 지정해야 하므로 아무런 이득이 없습니다.

여러분이 아요니, 당이타보있입것는 "고음원은니"를 언급한다고 할 때, 거기서 입니다. 당신이 언급하고 있다고 가정할 때....선언의 일부

기본적으로 이 함수는 여기에 지정된 처음 두 개 이후에 알 수 없는 수의 인수를 사용한다고 말합니다.

함수는 무엇을 기대해야 하는지 알 수 있는 방식으로 작성되어야 합니다. 그렇지 않으면 이상한 결과가 나올 것입니다.

은 이기을다기능은을 하십시오.printf기능 및 그 변형.

C는 다형성을 지원합니까?아뇨, 그렇지 않아요.

그러나 Python C API와 같이 구조체와 포인터를 사용하여 대략적인 변형의 다형성을 구현하는 여러 라이브러리가 있습니다.대부분의 경우 컴파일러가 적절한 유형 검사를 수행할 수 없습니다.

테크닉은 간단합니다.

typedef struct {
    char * (*to_string)();
} Type;

#define OBJ_HEADER Type *ob_type

typedef struct {
    OBJ_HEADER;
}  Object; 

typedef struct {
    OBJ_HEADER;
    long ival;        
} Integer;

typedef struct {
    OBJ_HEADER;
    char *name;
    char *surname;
} Person;

Integer 및 Person은 적절한 함수 포인터(예: integer_to_string 및 person_to_string과 같은 함수)가 있는 Type 개체를 가져옵니다.

이제 객체 *:를 수락하는 함수를 선언합니다.

void print(Object *obj) {
    printf("%s", obj->type->to_string());
}

이제 이 함수를 정수와 사람 모두에서 호출할 수 있습니다.

Integer *i = make_int(10);
print((Object *) i);

Person *p = make_person("dfa");
print((Object *) p);

편집

또는 i와 p를 Object *로 선언할 수 있습니다. 물론 make_int와 make_person은 Integer와 Person에 공간을 할당하고 적절한 캐스트를 수행합니다.

Object * 
make_integer(long i) {
     Integer *ob = malloc(sizeof(Integer));
     ob->ob_type = &integer_type;
     ob->ival = i;
     return (Object *) ob;
}

NB: 지금은 이 예제를 컴파일할 수 없습니다. 다시 한 번 확인하십시오.

저는 다음과 같은 함수의 특징을 발견했고, 이것이 일종의 다형성인지 궁금했습니다.

네, 그것은 다형성의 원시적인 형태입니다.하나의 기능 서명만으로 다양한 구조물을 통과할 수 있습니다.그러나 컴파일러는 유형 오류를 탐지하는 데 도움을 줄 수 없습니다.

언급된 내용에 추가: C는 다른 수단을 통해 다형성을 지원합니다.예를 들어 표준 라이브러리를 예로 들 수 있습니다.qsort임의 유형의 데이터를 정렬하는 함수입니다.

입력되지 않은 방법으로 그렇게 할 수 있습니다.void 데이터에 대한 포인터입니다.을 통해 됨).sizeof및.) 를 사용합니다.를 이작은포에를수전행다니됩써로으에 전달함으로써 이루어집니다.qsort기능.

이것은 런타임 다형성의 대표적인 예입니다.

가상 함수 테이블을 수동으로 관리하여 개체 지향 동작(특히 가상 함수 호출)을 구현하는 다른 방법이 있습니다.이 작업은 구조에 함수 포인터를 저장하고 전달하여 수행할 수 있습니다.를 들어 WinAPI는 기본 클래스 호출 디스패치 WinAPI)와 고급 합니다.DefWindowProc기본 클래스의 가상 메서드를 호출하는 시뮬레이션).

제 생각에 당신은 생략부호(...?)를 말하는 것 같습니다.이 경우 0개 이상의 파라미터가 뒤따르게 됩니다.그것은 stdarg.h로 정의된 varargs라고 불립니다.

http://msdn.microsoft.com/en-us/library/kb57fad8.aspx

printfuses는 이 기능을 사용합니다.그렇지 않으면 함수 끝에 매개 변수를 계속 추가할 수 없습니다.

C는 조잡한 형태의 다형성을 지원합니다.즉, 다른 유형으로 나타나고 행동할 수 있는 유형입니다.후드 아래에 있는 C++와 유사한 was에서 작동하지만(메모리가 정렬되는 것에 의존함), 당신은 캐스트를 통해 컴파일러를 도와야 합니다.예를 들어 구조를 정의할 수 있습니다.

typedef struct {
     char forename[20];
     char surname[20];
     } Person;

그리고 또 다른 구조:

    typedef struct {
             char forename[20];
             char surname[20];
             float salary;
             char managername[20];
             } Employee;

그리고나서

int main (int argc, int *argv)
{
    Employee Ben;
    setpersonname((Person *) &Ben);
}

void setpersonname(Person *person)
{
   strcpy(person->forename,"Ben");
}

위의 예는 직원이 사용자로 사용되는 것을 보여줍니다.

아니요, 변수 개수의 인수를 사용하는 함수입니다.

그것은 엄밀히 말하면 다형성이 아닙니다.fcntl은 변수 개수의 인수를 사용하며, 이는 printf 함수와 유사한 ...의 이유입니다.

C는 컴파일 시간 유형에 기반한 애드혹 다형성의 일종인 함수 오버로딩이나 다중 디스패치(즉, 런타임 유형에 기반한 오버로딩)를 지원하지 않습니다.

C에서 함수 오버로딩을 시뮬레이션하려면 여러 개의 다른 이름의 함수를 만들어야 합니다.함수의 이름은 종종 형식 정보를 포함합니다.fputc()캐릭터 및fputs()현용의

가변 매크로를 사용하여 다중 디스패치를 구현할 수 있습니다.다시 말하지만, 형식 정보를 제공하는 것은 프로그래머의 일이지만, 이번에는 추가 인수를 통해, 위에서 주어진 접근 방식의 경우 컴파일 시간 함수 이름과 대조적으로 런타임에 평가됩니다.printf()함수 제품군이 다중 디스패치의 가장 좋은 예는 아닐 수 있지만, 지금은 더 나은 기능이 떠오르지 않습니다.

형식 주석을 제공하기 위해 구조에서 변수 함수 또는 래핑 값 대신 포인터를 사용하는 다중 디스패치에 대한 다른 접근 방식이 있습니다.

표준 라이브러리의 printf 선언은 다음과 같습니다.

int printf(const char*, ...); 

생각해 보세요.

C에서 다형성 동작을 지원하는 코드를 작성할 수 있지만...별 도움이 되지 않을 겁니다이는 함수에 대한 변수 인수에 대한 것입니다.

다형성 동작을 사용하려면 조합 및 구조체가 "유형" 섹션과 유형에 따라 가변 필드가 있는 데이터 구조를 구성합니다.구조물에 함수 포인터 표를 포함할 수도 있습니다.푸! 당신은 C++를 발명했습니다.

예 C 다형성을 지원합니다.

컴파일러에 의해 C 코드로 처음 변환된 경우 다형성을 구현하기 위해 가상을 사용하여 C++로 작성하는 코드(자세한 내용은 여기에서 확인할 수 있음).

C++의 가상 기능은 함수 포인터를 사용하여 구현된다는 것은 잘 알려져 있습니다.

언급URL : https://stackoverflow.com/questions/1124265/what-does-mean-in-an-argument-list-in-c

반응형