source

C는 과부하를 지원합니까?

goodcode 2022. 7. 30. 19:09
반응형

C는 과부하를 지원합니까?

C가 오버 로딩을 지원하는지 알고 싶습니다.printf와 같은 시스템 함수를 사용하는데 인수 수가 다릅니다.나 좀 도와 줘.

아니요, C는 어떤 형식의 오버로드도 지원하지 않습니다(내장 연산자가 이미 오버로드사실을 오버로드의 한 형태로 간주하지 않는 한).

printf는 varargs라는 기능을 사용하여 동작합니다.과부하 상태인 것처럼 보이는 콜을 발신합니다.

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

사실은 그렇지 않다.printf 함수는 1개뿐이지만 컴파일러는 특별한 호출 규칙을 사용하여 호출합니다.여기서 지정한 인수는 스택[*]에 순서대로 배치됩니다.printf(또는 vprintf)는 형식 문자열을 검사하고 이를 사용하여 인수를 다시 읽는 방법을 계산합니다.이것이 printf가 타입 세이프가 아닌 이유입니다.

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

[*] 표준에서는 실제로 스택에 전달되거나 스택에 대해 전혀 언급하지 않지만, 이는 자연스러운 구현입니다.

연산자 오버로드에 대한 C 표준에는 조항이 없습니다.많은 빌드 시스템이 동일한 이름의 여러 기능을 수용할 수 있는 설비가 없다는 이유로 이를 추가하는 제안은 거부되었습니다.C++는 예를 들어 다음을 통해 이 문제를 해결할 수 있습니다.

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

v__foo_i, i_foo_pc 및 l_foo_pc와 같은 함수로 컴파일합니다(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)) )

이런 이 있어요.uint32_t x=word_swap(0x12345678); 됩니다.x( (0x87654321). 이 . 즉, "이러다"와 같은 입니다.uint32_t y=word_swap(x);는 수십 개의 명령을 생성할 수 있습니다.부분적으로 언롤된 루프가 있는 함수에 대한 호출은 거의 같은 속도이지만 훨씬 더 콤팩트합니다.한편 루프를 사용하면 결과가 컴파일 시간 상수로 간주되지 않습니다.

GCC를 사용하면 상수일 경우 상수 산출 매크로를 사용하거나 변수가 지정되면 함수를 호출하는 매크로를 정의할 수 있습니다.

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

이 접근 방식은 유형 기반 오버로딩이 수행할 수 있는 모든 작업을 수행할 수는 없지만 오버로딩이 수행할 수 없는 많은 작업을 수행할 수 있습니다.

C는 오버로드를 지원하지 않습니다.(확실히 오버로드를 지원한다고 해도 printf에는 사용하지 않습니다.모든 타입의 조합에 printf가 필요합니다!)

printf는 varargs를 사용합니다.

이 모든 것은, 「지원」의 정의 방법에 따라 다릅니다.

C 언어에서는 코어 언어 내에서 오버로드된 연산자를 제공합니다.이는 C 언어에서는 대부분의 연산자가 오버로드된 기능을 가지고 있기 때문입니다.바이너리를 사용할 수 있습니다.+int,long및 포인터 타입을 사용합니다.

된 함수를 직접 할 수 또, C 타입으로 , 다른 가 있습니다(예: 「C」 「C」abs,fabs,labs등 ) 。

즉, C는 코어 언어로 하드코드 되어 있는 오버로드가 어느 정도 존재하지만 표준 라이브러리나 사용자 모두 자신의 오버로드가 허용되지 않습니다.

직접적이진 않지만, 이건 아니야printf는 동작합니다만, 타입의 사이즈가 다른 경우는 매크로를 사용해 과부하 함수와 동등한 기능을 작성할 수 있습니다.C99 표준의 tgmath.h의 유형 일반 수학 함수는 이러한 방식으로 구현될 수 있다.

no c는 함수 오버로드를 지원하지 않습니다.다만, g++(c++ 컴파일러)를 사용하고 있는 경우는, 컴파일/동작할 수 있습니다.

아니요, C는 오버로드를 지원하지 않지만 Varadic 함수를 지원합니다.printf는 Varadic 함수의 예입니다.

아니요, 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);

C 오버로드를 지원하지 않습니다.그러나 이 기능을 구현하려면 자체 라이브러리를 프로그래밍하면 과부하 지원을 제공할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2351792/does-c-support-overloading

반응형