매개 변수 전달 선언이란 무엇입니까?
다음 코드를 컴파일하기 전까지는 C 구문을 꽤 잘 안다고 생각했습니다.
void f(int i; double x)
{
}
컴파일러가 작동할 것으로 예상했는데 작동했습니다. 하지만 오류 메시지가 표시되지 않습니다.
test.c:1:14: error: parameter ‘i’ has just a forward declaration
그 다음에 시도했습니다.
void fun(int i; i)
{
}
에 실패한
test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’
그리고 마지막으로
void fun(int i; int i)
{
}
놀랍게도, 그것은 성공했습니다!
나는 이 구문을 실제 C 코드에서 본 적이 없습니다.그게 무슨 소용이 있습니까?
함수 정의의 다음과 같은 형식입니다.
void fun(int i; int i)
{
}
에서는 매개 변수 전달 선언 기능이라는 GNU C 확장을 사용합니다.
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
이 기능을 사용하면 실제 매개 변수 목록 앞에 매개 변수 포워드 선언을 사용할 수 있습니다.예를 들어 가변 길이 배열 매개 변수가 있는 함수에서 가변 길이 배열 매개 변수 뒤에 크기 매개 변수를 선언하는 데 사용할 수 있습니다.
예:
// valid, len parameter is used after its declaration
void foo(int len, char data[len][len]) {}
// not valid, len parameter is used before its declaration
void foo(char data[len][len], int len) {}
// valid in GNU C, there is a forward declaration of len parameter
// Note: foo is also function with two parameters
void foo(int len; char data[len][len], int len) {}
OP 예제에서,
void fun(int i; int i) {}
정방향 매개변수 선언은 실제 매개변수와 그 어떤 것에도 사용되지 않기 때문에 어떠한 목적에도 도움이 되지 않습니다.fun
함수 정의는 실제로 다음과 같습니다.
void fun(int i) {}
참고로 이것은 GNU C 확장이며 C가 아닙니다.를 사용하여 컴파일gcc
그리고.-std=c99 -pedantic
예상되는 진단을 제공합니다.
경고: ISO C는 전달 매개 변수 선언을 금지합니다 [-pedicant]
사용하는 컴파일러에 따라 다릅니다.";" 없이 사용하고 ","를 사용합니다.
언급URL : https://stackoverflow.com/questions/17771484/what-is-a-parameter-forward-declaration
'programing' 카테고리의 다른 글
도커 컨테이너에서 호스트 포트에 액세스하는 방법 (0) | 2023.08.20 |
---|---|
redux 형식의 Ajax 호출과 같은 비동기 소스를 기반으로 초기 값을 설정하는 방법 (0) | 2023.08.20 |
jQuery "각()" 함수가 동기화됩니까? (0) | 2023.08.15 |
라우터 getCurrentNavigation은 항상 null을 반환합니다. (0) | 2023.08.15 |
Swift에서 배열의 마지막 요소를 가져오려면 어떻게 해야 합니까? (0) | 2023.08.15 |