"C 언어 - 암시 적 함수 선언 암시 적 선언"

1. 암시 적 함수 선언의 개념

  C 언어에서는 호출하기 전에 함수를 선언 할 필요가 없습니다. 지정하지 않을 경우, 컴파일러는 자동으로 함수를 호출하는 C 코드에 어셈블리 코드의 결과로 암시 적 문의 규칙을 따릅니다. 다음은 그 예이다 :

INT 본체 ( 의 INT 는 argc, 문자 ** ARGV) 
{ 
    이중 X = any_name_function ();
    반환  0 ; 
}

  간단하게 컴파일 위의 소스 코드를, 거기에 오류가 없다 ,하지만 링크가 무대가 있기 때문에 찾을 수없는 이름 any_name_function의 함수 본문 및 오류 .  

[시험 centos192 smstong @] $ gcc가 - (C)을 main.c 
[smstong @ centos192 시험] $ GCC main.o를 
main.o를 : 함수에서 '주 ' : 
. main.c의 :( 텍스트 + 0x15 ) '으로 정의되지 않은 참조 any_name_function ' (`any_name_function '引用没有定义)
 collect2 : ld에返回1

  C 언어가 자동으로 암시 적 선언을 사용하여 선언하지 않는 기능을 제공하기 때문에 컴파일러가 불평하지 않는 이유. 그것은 다음과 같은 코드에 해당된다 :

INT의 any_name_function ();
INT 본체 ( 의 INT 는 argc, 문자 ** ARGV) 
{ 
    이중 X = any_name_function ();
    반환  0 ; 
}

2. 문제는 프로그램을 발생

  예를 들면 위에 주어진, 그리고 링크 단계에서 문제를 쉽게 찾을 수 있기 때문에, 많은 영향을 발생하지 않습니다. 그러나 설명 할 수없는 런타임 오류는 다음 예에서 발생합니다.

#INCLUDE <STDIO.H>
 INT 본체 ( 의 INT 는 argc, 문자 ** ARGV) 
{ 
    이중 의 X = SQRT의 ( 1 ); 
    의 printf ( " %의 LF " , X);
    반환  0 ; 
}

  GCC 컴파일러 및 링커

[시험 centos192 smstong @] $의 GCC - C의 main.c 
의 main.c : 함수 '주'에서 다음 
의 main.c : . 6 :주의 : 내장 함수 'SQRT'호환의 암시 적 선언 
[smstong에서 @의 centos192 시험] $ gcc가 main.o를

  영업 실적  

1.000000

  컴파일 할 때 경고를 제공합니다 암시 적으로 내장 함수 'SQRT'로 선언 제안 호환되지 않습니다. 컴파일시 GCC 컴파일러는 두 사람이 동일하게 찾을 수없는 경우 자동으로 같은 이름의 암시 적 선언을 찾기 위해 라이브러리 헤더 파일 (BIF) 함수에서 사용할 수있는 전화 코드를 생성하는 프로토 타입 내장 함수를 선언합니다. 이것은 프로그래머가 아이디어를 기대 종종있다.
  위의 함수 프로토 타입의 예를 암시 적으로 선언 :

INT SQRT ( INT );

  같은 이름과 기능 프로토 타입에 해당하는 내장되어 있습니다 :

더블 (SQRT 더블 );

  최종 컴파일러는 원하는 효과를 달성하기 위해 내장 기능 프로토 타입에 따라 집계되고있다. 그러나이 동작은 gcc가 C 언어 컴파일러 사양은 모든 컴파일러 구현은 이러한 기능을 가지고 있지 아니다.

 

3. 암시 적으로 선언 된 함수 이름 만 라이브러리가 존재하는 링크, 그리고 int를 돌려

  

 

추천

출처www.cnblogs.com/zhuangquan/p/11757879.html