C의 함수명은 어떤 타입입니까?
C에서는 항상 이해했어요func
그리고.&func
동등했습니다.둘 다 제 Win64 시스템에서 8바이트인 타입 포인터여야 한다고 생각합니다.하지만 저는 그냥 이것을 시도해 보았습니다.
#include <stdio.h>
int func(int x, int y)
{
printf("hello\n");
}
int main()
{
printf("%d, %d\n", sizeof(&func), sizeof(func));
return 0;
}
그리고 그 결과를 기대하고 있습니다.8, 8
그것을 받고 놀랐습니다.8, 1
대신.
왜 이러한가?정확히 어떤 유형이. func
? 그것은 타입인 것 같습니다.char
혹은 그에 상응하는 것.
이게 무슨 일입니까?
제가 정리를 해봤습니다.gcc -std=c99
변화가 생긴다면요
C의 함수명은 어떤 타입입니까?
함수 이름 또는 함수 지정자가 함수 유형을 갖습니다.식에 사용되는 경우, 피연산자인 경우를 제외하고sizeof
아니면&
연산자, "함수 복귀형"에서 "함수 복귀형"으로 변환됩니다. (이는 C99, 6.3.2.1p4에 명시되어 있습니다.)
지금이다
sizeof(func)
유효하지 않은 CASsizeof
함수 유형의 피연산자에서는 사용할 수 없습니다.이는 의 제약 조건에 명시되어 있습니다.sizeof
연산자:
(C99, 6.5.3.4p1 제약 조건) "연산자의 크기는 함수형 또는 불완전한 형식을 갖는 표현, 그러한 형식의 괄호가 쳐진 이름 또는 비트 필드 멤버를 지정하는 표현에 적용되지 않아야 합니다."
그렇지만
sizeof(func)
는 GNUC에서 허용됩니다.
C 는 GNU GNU 는sizeof
함수 유형 수율의 피연산자로1
:
6.23 빈 점과 함수 점의 산술
[...] 크기는 void 및 함수 유형에서도 허용되며 1을 반환합니다.
http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
주어진:
int func(int x, int y) { /* ... */ }
어투, 어투, 어법func
는 함수형입니다.구체적으로 말하자면, 그 유형은int(int, int)
, 이것은 타입 "함수"에 대한 C의 구문입니다.int
매개 변수 반환int
구문은 볼 수 (함수 유형을 직접 참조하는 것은 일반적이지 않기 때문에 해당 구문은 자주 볼 수 없습니다.)
대부분의 컨텍스트에서 함수 유형의 표현은 함수에 대한 포인터로 암묵적으로 변환됩니다. 이 경우 포인터는 유형입니다.int(*)(int, int)
.
이러한 암묵적 변환이 발생하지 않는 컨텍스트는 다음과 같습니다.
식이 단항의 피연산자일 때
&
; 그 경우에는&func
다음과 같이 함수의 주소를 산출합니다.func
그 자체로는 보통 그렇습니다); 그리고표현이 다음의 피연산자일 때
sizeof
. 이 예외를 제외하면,sizeof func
함수 포인터의 크기를 산출합니다.대신 제약 조건 위반이므로 컴파일러의 진단이 필요합니다.
(: 호출에 될 때 됩니다.이 변환은 함수 이름이 함수 호출에 사용될 때 발생합니다.()
"operator" (표준에서는 그렇게 부르지 않음)는 포인터-투-함수 타입의 접두사를 필요로 합니다.)
gcc에는 비표준 확장자가 있습니다. 함수 포인터와 유형에 대한 포인터 산술을 허용합니다.void*
, 포인터 산술처럼 행동하기char*
포인터(즉, 바이트 단위로 동작함).안타깝게도 IMHO, gcc는 kludge를 통해 함수의 종류와 종류를 설정하여 이 작업을 하였습니다.void
을 얻는 sizeof func == 1
; 표준 적합 모드 중 하나를 활성화하는 경우(예:gcc -std=c99 -pedantic
), 경고를 받습니다.
부수적으로, 사용하지 마십시오.%d
결과를 인쇄하다sizeof
.sizeof
유형의 결과를 가져옵니다.size_t
. 구현에서 지원하는 경우(C99 이상),%zu
; 그렇지 않다면, 당신은 명시적으로 변환하기 위해 깁스를 사용해야 합니다.size_t
인쇄할 수 있는 가치가 있습니다.예를 들어,
printf("%lu\n", (unsigned long)sizeof &func);
C의 함수명은 어떤 타입입니까?
기능적인 타입입니다.
C에서는 항상 이해했어요
func
그리고.&func
동치였습니다.
글쎄, 그것들은 "동등한" 것이 아닙니다.그러나 함수는 포인터 대 함수로 붕괴됩니다.
두 사람이 모두 포인터 타입이어야 한다고 생각합니다.
그것은 잘못된 가정입니다.
그리고 출력을 8로 예상하고 8을 1로 예상하고는 깜짝 놀랐습니다.왜 이러한가?
왜냐하면 1. 컴파일을 하면 UB이기 때문이고 2. 애초에 컴파일을 해서는 안되며 따라서 당신의 프로그램은 무엇이든 자유롭게 할 수 있습니다.
이름에 C에 형식이 없습니다.일부 종류의 이름은 유형의 ef 이름, 개체 또는 함수와 같이 유형이 있는 개체를 나타냅니다.다른 종류의 이름은 전처리기 기호나 같은 종류가 없는 개체를 나타냅니다.goto
표식들그러나 다른 종류의 이름들은 단순히 유형들 그 자체를 나타냅니다, 즉.typedef
이름들
함수의 이름은 함수 유형을 가진 개체를 의미합니다.해당 함수 유형에는 반환 유형과 매개 변수에 대한 (불완전한) 정보가 포함됩니다.
함수를 값으로 사용하면 항상 포인터 대 함수 유형으로 조작됩니다.이와 같은 기능은 휴대용 C 프로그램에서는 전달할 수 없지만, 기능에 대한 포인터는 전달할 수 있습니다.
개념적으로, 심지어 직접적인 전화에서도foo()
, 무슨 일이 있냐면foo
, 함수를 나타내는 표현은 평가 시 함수에 대한 포인터 값으로 암묵적으로 변환됩니다.()
함수 호출 후 수정 연산자는 이 포인터를 통해 함수를 호출합니다.
함수 유형을 가진 식을 사용하여 포인터 값을 생성하는 규칙이 있습니다. 단, 해당 수식이 다음의 피연산자인 경우는 예외입니다.&
)sizeof
교환입니다.func
그리고.&func
동일한 값을 산출한다는 점에서만 동등합니다.func
은(는) 암시적으로 포인터 값을 생성합니다.&func
포인터의 암시적 생성을 억제합니다(func
의 피연산자입니다.&
따라서 변환이 억제됩니다.) 하지만,&
주소를 가져옵니다.
이렇게 볼 수 있습니다.sizeof &func
그리고.sizeof func
다릅니다. 포인터의 크기를 사용하고 후자는 함수의 크기를 사용하려고 합니다.전자는 포인터의 크기를 사용하고 후자는 함수의 크기를 사용하려고 합니다.
함수의 크기를 취하는 것은 C의 제약 조건 위반입니다. 표준을 준수하는 구현에서 진단을 받아야 합니다.프로그램이 여전히 번역되고 값이 .1
실행 시 생성되며, 이는 사용자 언어 구현에 특정한 "bonus" 동작입니다.표준어로 되어 있지 않습니다.
언급URL : https://stackoverflow.com/questions/18816907/what-type-is-a-function-name-in-c
'sourcecode' 카테고리의 다른 글
"WARn Can't can't decision-length of response body"는 무엇을 의미하며 어떻게 제거해야 합니까? (0) | 2023.11.04 |
---|---|
전원 셸 및 오류 ConvertTo-SecureString : 키가 지정된 상태에서 사용할 수 없도록 유효하지 않음을 사용하여 재사용을 위한 자격 증명 저장 (0) | 2023.10.30 |
jQuery에서 숫자에 쉼표를 더합니다. (0) | 2023.10.30 |
각 행의 결측/NaN 수 계산 (0) | 2023.10.30 |
사용자 지정 쿼리 루프 제품 woocmerce에서 작동하지 않는 AJAX add to cart 버튼 (0) | 2023.10.30 |