program tip

C는 오버로딩을 지원합니까?

radiobox 2021. 1. 7. 07:49
반응형

C는 오버로딩을 지원합니까?


C가 오버로드를 지원하는지 알고 싶습니다. 인자가 다른 printf와 같은 시스템 함수를 사용하기 때문입니다. 도와주세요


아니요, C는 어떤 형태의 오버로딩도 지원하지 않습니다 (기본 제공 연산자가 이미 오버로딩의 한 형태로 오버로드 된다는 사실을 고려하지 않는 한 ).

printfvarargs라는 기능을 사용하여 작동합니다. 과부하가 걸린 것처럼 보이는 전화를 겁니다 .

printf("%d", 12); // int overload?
printf("%s", "hi"); // char* overload?

사실 그렇지 않습니다. printf 함수는 하나 뿐이지 만 컴파일러는 특수 호출 규칙을 사용하여 호출합니다. 여기서 제공하는 인수는 스택 [*]에 순서대로 배치됩니다. printf (또는 vprintf)는 형식 문자열을 검사하고이를 사용하여 해당 인수를 다시 읽는 방법을 알아냅니다. 이것이 printf가 형식에 안전하지 않은 이유입니다.

char *format = "%d";
printf(format, "hi"); // undefined behaviour, no diagnostic required.

[*] 표준은 실제로 스택에 전달 되었다고 말 하거나 스택을 전혀 언급 하지 않습니다 . 그러나 그것은 자연스러운 구현입니다.


C는 오버로딩을 지원하지 않습니다. (분명히 그렇게하더라도 printf에는 사용하지 않을 것입니다. 가능한 모든 유형 조합에 대해 printf가 필요합니다!)

printf는 varargs를 사용합니다 .


아니요, C는 오버로딩을 지원하지 않지만 Variadic 함수 는 지원 합니다 . printf는 Variadic 함수의 예입니다.


그것은 모두 "지원"을 정의하는 방법에 달려 있습니다.

분명히 C 언어는 핵심 언어 내에서 오버로드 된 연산자를 제공합니다. C의 대부분의 연산자에는 오버로드 된 기능이 있기 때문입니다. 이진 +int, long및 포인터 유형과 함께 사용할 수 있습니다.

그러나 동시에 C는 자신 만의 오버로드 된 함수를 생성하는 것을 허용하지 않으며 C 표준 라이브러리는 다른 유형 (예 : abs, fabs등) labs함께 사용하기 위해 다른 이름의 함수에 의존해야 합니다.

즉, C는 핵심 언어로 하드 코딩 된 어느 정도의 오버로딩을 가지고 있지만 표준 라이브러리 나 사용자는 자신의 오버로딩을 할 수 없습니다.


아니요, C는 오버로딩을 지원하지 않습니다. C ++와 유사한 오버로딩을 구현하려면 일종의 일관된 규칙을 사용하여 함수 이름을 수동으로 조작해야합니다. 예를 들면 :

int myModule_myFunction_add();
int myModule_myFunction_add_int(int);
int myModule_myFunction_add_char_int(char, int);
int myModule_myFunction_add_pMyStruct_int(MyStruct*, int);

직접적으로는 아니고 이것이 printf작동 하는 방식은 아니지만 유형이 다른 크기 인 경우 매크로를 사용하여 오버로드 된 함수와 동등한 기능을 만들 수 있습니다. C99 표준의 tgmath.h 에있는 유형 제네릭 수학 함수 는 이러한 방식으로 구현 될 수 있습니다.


C 표준에는 운영자 과부하에 대한 규정이 없습니다. 많은 빌드 시스템에 동일한 이름의 여러 기능을 수용 할 수있는 기능이 없다는 이유로 추가 제안이 거부되었습니다. C ++은 예를 들어

void foo(int);
int foo(char*);
long foo(char *, char **);

v__foo_i, i__foo_pc 및 l__foo_pc_ppc와 같은 이름의 함수로 컴파일합니다. [컴파일러는 다른 이름 지정 규칙을 사용하지만 C ++ 표준은 식별자에 내부 이중 밑줄 사용을 금지하여 컴파일러가 충돌없이 위와 같은 이름을 지정할 수 있도록 허용합니다]. C 표준의 작성자는 컴파일러가 오버로딩을 허용하기 위해 명명 규칙을 변경하도록 요구하지 않았으므로이를 제공하지 않습니다.

컴파일러가 이름 지정 문제를 일으키지 않고 정적 및 인라인 함수의 오버로딩을 허용하는 것이 가능하고 유용합니다. 이것은 실제로 헤더 파일을 가질 수 있기 때문에 외부 링크 가능한 함수의 오버로딩을 허용하는 것만 큼 유용합니다.

void foo_zz1(int);
int foo_zz2(char*);
long foo_zz3(char *, char **);
inline void foo(int x) { foo_zz1(x); }
inline int foo(char* st) { foo_zz2(st); }
long foo(char *p1, char **p2) { foo_zz3(p1,p2); }

위를 비표준 확장으로 지원하는 C와 C ++ 사이의 하이브리드를위한 임베디드 컴파일러를 살펴 보았지만 세부 사항에 대해서는 긍정적이지 않습니다. 어쨌든 일부 C 컴파일러가 외부 연결이없는 함수의 오버로딩을 지원하더라도 C14에서는 지원하지 않으며 이러한 기능을 향후 C 표준에 추가하려는 적극적인 노력을 (불행히도) 알지 못합니다.

그럼에도 불구하고 GCC는 매크로를 사용하여 연산자 오버로딩이있는 언어에서 직접 지원되지 않는 오버로딩 형식을 지원하도록 만들 수 있습니다. GCC에는 표현식이 컴파일 타임 상수로 평가 될 수 있는지 여부를 식별하는 내장 함수가 포함되어 있습니다. 이 내장 함수를 사용하면 인수에 따라 다른 방식 (함수 호출 포함)을 평가할 수있는 매크로를 작성할 수 있습니다. 이것은 컴파일 시간 상수 인수가 주어지면 수식이 컴파일 시간 상수로 평가되지만 변수 인수가 주어지면 끔찍한 혼란을 초래하는 경우에 유용 할 수 있습니다. 간단한 예로서, 32 비트 값을 비트 반전시키고 자한다고 가정 해보십시오. 값이 일정하면 다음을 통해 수행 할 수 있습니다.

#define nyb_swap(x) \
  ((((x) & 1)<<3) | (((x) & 2)<<1) | (((x) & 4)>>1) | ((((x) & 8)>>3) )
#define byte_swap(x) \
  ( (nyb_swap(x)<<4) | nyb_swap((x) >> 4) )
#define word_swap(x) \
  ( (byte_swap(x)<<24) | (byte_swap((x) >> 8)<<16) | \
    (byte_swap((x) >> 16)<<8) | (byte_swap((x) >> 24)) )

And an expression like uint32_t x=word_swap(0x12345678); would simply load x with 0x87654321. On the other hand, if the value is not a constant, the result would be horrible: an expression like uint32_t y=word_swap(x); might generate many dozens of instructions; a call to a function with a partially-unrolled loop would be almost as fast but a lot more compact. On the other hand, using a loop would prevent the result from being regarded as a compile-time constant.

Using GCC, one can define a macro which will either use the constant-yielding macro if given a constant, or call a function when given a variable:

#define wswap(x) \
  (__builtin_constant_p((x)) ? word_swap((x)) : word_swap_func((x))

This approach can't do everything type-based overloading can do, but it can do many things overloading can't.


C Does not support overloading. But we can implement that functionality by programming our own library that in turn could provide overloading support.


No c does not support function overloading. But you can get it to compile/work if you are using g++ (a c++ compiler).

ReferenceURL : https://stackoverflow.com/questions/2351792/does-c-support-overloading

반응형