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
'source' 카테고리의 다른 글
시간 초과 재설정(vuetify 스낵바) (0) | 2022.07.30 |
---|---|
반복기와 반복기의 차이점과 사용법은 무엇입니까? (0) | 2022.07.30 |
자바에서 소수점 2자리 플로트를 인쇄하려면 어떻게 해야 하나요? (0) | 2022.07.30 |
스택은 위쪽으로 증가합니까, 아니면 아래로 증가합니까? (0) | 2022.07.30 |
플랫폼에 의존하지 않는 size_t 형식 지정자(c) (0) | 2022.07.30 |