programing

기능 선언을 위한 대체(K&R) C 구문과 프로토타입

yoursource 2022. 7. 17. 11:02
반응형

기능 선언을 위한 대체(K&R) C 구문과 프로토타입

에 은 무엇입니까?C- K&R? - K&R?

int func (p, p2)
    void* p;
    int  p2;
{
    return 0;
}

저는 Visual Studios 2010beta에서 이 글을 쓸 수 있었습니다.

// yes, the arguments are flipped
void f()
{
    void* v = 0;
    func(5, v);
}

난 이해가 안돼.이 구문의 요점은 무엇입니까?쓸 수 있다:

int func (p, p2)
    int  p2;
{
    return 0;
}
// and write
int func (p, p2)
{
    return 0;
}

지정된 것은 사용하는 파라미터의 수와 반환 타입뿐입니다.만, 이유는 입니까?int paranName수수선 언언 ??? ???상하하다

이것도 스탠다드 C인가요?

당신이 묻고 있는 질문은 한 가지가 아니라 두 가지입니다.지금까지의 대부분의 답변은 "이것은 K&R 스타일"이라는 포괄적인 답변으로 모든 것을 다루려고 했지만, 실제로는 극히 일부만 K&R 스타일이라고 알려진 것과 관련이 있다(C 언어 전체를 어떤 식으로든 "K&R 스타일"이라고 보지 않는 한).

첫 번째 부분은 함수 정의에 사용되는 이상한 구문입니다.

int func(p, p2)
void *p;
int  p2; /* <- optional in C89/90, but not in C99 */
{
  return 0;
}

K&R에 관한 것입니다.하다됩니다(C99에서는 "implicit " 즉, C99에서는 "no implicit int"할 수 .p2를 참조해 주세요.

2부는 K&R 스타일과는 별 상관이 없다.함수는 "swapped" 인수를 사용하여 호출할 수 있다는 사실을 참조합니다.즉, 이러한 호출에서는 파라미터 타입 체크가 이루어지지 않습니다.이것은 K&R 스타일의 정의 자체와는 거의 관계가 없지만, 시제품이 없는 기능과는 관계가 있습니다.C에서는 이와 같은 함수를 선언합니다.

int foo();

그것은 실제로 함수를 선언합니다 실제론 함수 선언한다.foo 없는 유형의 지정되지 않은 수의 매개 변수를 사용합니다.라고 할 수 있다

foo(2, 3);

그리고 로서

j = foo(p, -3, "hello world");

등등 (여러분은 이해하셨을 겁니다)

적절한 인수가 있는 콜만이 기능합니다(다른 콜이 정의되지 않은 동작을 발생시키는 것을 의미합니다). 그러나 그 정확성을 확인하는 것은 전적으로 사용자에게 달려 있습니다.컴파일러는 올바른 파라미터 타입과 파라미터의 총수를 마법처럼 파악하고 있어도 잘못된 파라미터를 진단할 필요가 없습니다.

사실 이 동작은 C언어의 특징입니다.위험하긴 하지만 그래도 특징이죠이런 걸 할 수 있어요.

void foo(int i);
void bar(char *a, double b);
void baz(void);

int main()
{
  void (*fn[])() = { foo, bar, baz };
  fn[0](5);
  fn[1]("abc", 1.0);
  fn[2]();
}

즉, 타입캐스트 없이 "다형" 배열에 다른 함수 유형을 혼합합니다(단, 여기서는 가변 함수 유형을 사용할 수 없습니다).다시 말씀드리지만, 이 기술의 본질적인 위험성은 매우 명백합니다(사용한 적은 없지만, 어디에 도움이 될지는 상상할 수 있습니다). 어쨌든 그것은 C입니다.

처음과 그 답의 마지막은 연결시키는 비트 두번째 부분입니다.마지막으로, 답변의 두 번째 부분을 첫 번째 부분과 연결하는 비트입니다.당신이 K&,R-style 함수 뜻 매김 하면 해당 기능에 대한 시제품 소개하지도 않는다.K&, R스타일의 함수를 정의할 때 함수의 프로토타입을 도입하지 않습니다.내가 아는 한 함수형에 관한 한 당신의기능타입에 관한 한,.func정의정의가 선언하다를 선언하funcas~하듯이

int func();

즉,도 종류도 총 매개 변수 수가 선언된다.즉, 유형 및 총 매개변수 수는 선언되지 않습니다.당신의 원래 글에서 당신은 "...처음"게시물에는..."명시될 것 같이라고 적혀 있습니다다. 얼마나 params 이것을 사용하다...". 공식적으로 말하면 그것은 하지 않는다!몇 개의 파라메타를 사용하는지가 명시되어 있는 것 같습니다.정식적으로는 그렇지 않습니다.당신의two-parameter K& 후에;2파라미터의 K&, R후 스타일R-style.func정의 아직도아직호출할수 있는 정의 부를 수 있습니다.funcas~하듯이

func(1, 2, 3, 4, "Hi!");

제약 위반이 발생하지 않습니다.(보통 품질 컴파일러는 경고를 보냅니다)

또한 때때로 간과되는 사실은

int f()
{
  return 0;
}

는 원형을 도입하지 않나 또한 K&,R-style 기능 정의.A프로토타입을 도입하지 않는 K&, R함수정의이기도 합니다 스타일의.그것"현대"을 만들기 위해서는표현해야 합니다 명료하게 명시적 '현대적'으로만들기 위해서는 들어가야 하는군요void매개 변수 list파라미터 리스트에서에

int f(void)
{
  return 0;
}

마지막으로 일반적인 생각과는 달리 C99에서는 K&R 스타일의 함수 정의와 비프로토타입 함수 선언이 모두 완전히 지원된다.내 기억이 맞다면 전자는 C89/90부터 폐지되었다.C99는 함수를 처음 사용하기 전에 선언해야 하지만 선언이 프로토타입일 필요는 없습니다.이러한 혼란은 일반적인 용어 혼용에서 비롯된 것으로 보인다.많은 사람들이 함수 선언을 "시제품"이라고 부르지만, 사실 "기능 선언"은 "시제품"과 동일하지 않다.

이것은 상당히 오래 된 K&, RC언어의 문법(ANSI/ISO C이전임).이것은 꽤 오래된 K&, RC구문입니다(ANSI/ISO C이전 버전).요즘 더 이상(이미 니가 그것의 주요한 불이익에 주목하였다:컴파일러는 당신을 위해 인수 형식을 확인하지 않을 것) 사용하지 않아야 한다.오늘날에는 더 이상 사용하지 않는 것이 좋습니다(이미 그 주요 단점을 알아차렸듯이 컴파일러는 인수 유형을 확인하지 않습니다).그 인수 형식 실제로 디폴트로 인수유형은으로 디폴트 한다.int당신의 예에.

그 당시에는 이 구문이 사용되었으며, 때때로 다음과 같은 함수를 찾을 수 있습니다.

foo(p, q) 
{
    return q + p;
}

에 대한 형식으로 어느 나라였니?실제로 유효한 정의foo,p,그리고.q기본적으로int.

이것은 단순히 오래된 구문일 뿐이며, 보다 익숙한 "ANSI C" 구문보다 이전 날짜입니다.보통 'K&R C'라고 하죠

컴파일러는 물론 완전하고 오래된 코드 베이스를 처리할 수 있도록 지원합니다.

때 C기능에 대한 프로토 타입에서 그것은 유물이다.옛날에는 (내 생각에) 함수가 되돌아오는 것으로 가정되었다.int그리고 그 모든 논쟁은int함수 파라미터에 대한 확인은 이루어지지 않았습니다.

현재 C 언어로 된 기능 프로토타입을 사용하는 것이 훨씬 좋습니다.
또한 C99에서 사용해야 합니다(C89는 이전 구문을 그대로 사용합니다).

또한 C99는 (시제품 없이) 기능을 선언해야 합니다.새로운 함수를 처음부터 작성하려면 선언문을 제출해야 합니다.또한 프로토타입으로 만들어야 합니다.손실되는 것은 없고 컴파일러로부터 추가 체크도 받을 수 있습니다.

이것은 1989년에 C가 표준화되기 전의 원래의 K&R 구문입니다.C89는 C++에서 빌린 기능 프로토타입을 도입하고 K&R 구문을 폐지했다.새로운 코드로 사용할 이유가 없습니다(그리고 사용하지 않을 이유가 많습니다).

언급URL : https://stackoverflow.com/questions/1630631/alternative-kr-c-syntax-for-function-declaration-versus-prototypes

반응형