2014-12-31 4 views
3

C 표준 라이브러리에서 제공하는 구조체 및 함수 선언을 전달할 수 있습니까?C 표준 라이브러리의 전달 엔티티를 선언 하시겠습니까?

나의 배경은 C++이며 대답은 아니오입니다. 이것의 주된 이유는 C++ 표준 라이브러리에 의해 위임 된 구조체 나 클래스가 배후에있는 템플릿이 될 수 있고 "비밀"템플릿 매개 변수를 가질 수 있으므로 순진한 비 템플릿 선언으로 적절하게 선언 할 수 없다는 것입니다. 사용자가 특정 구현의 특정 버전에서 특정 엔터티를 선언하는 방법을 정확히 파악하더라도 구현시 은 향후 버전의을 중단하지 않아도됩니다.

나는 손에 어떤 C 표준의 사본을 가지고 있지 않지만 분명히 C.

에는 템플릿

그래서는 C 표준 라이브러리에서 엔티티를 선언 전달하는 법적 없다?

C++ 표준 라이브러리의 엔터티가 전달 선언되지 않을 수있는 또 다른 이유는 구현에서 제공하는 헤더가 일반 규칙을 따르지 않아도된다는 것입니다. 예를 들어 최근 질문에서 필자는 구현에서 제공 한 C++ 헤더가 실제 파일이어야하고 대답이 '아니오'인지 묻습니다. 그 중 하나가 C.

에 적용되는 경우 나는

은 C 표준 라이브러리는 C 및 C++하지만이 질문에 대해 나는 단지 C.에 대해 부탁 해요 모두 사용이

+0

예 당신은 당신의 컴파일러를 만들 정의 어딘가에 있다는 것을 알고 단지 헤더 파일 – Gopi

+0

AFAIK의 선언을 할 수 있습니다 C. 함수와 구조체를 선언 전달할 수 있습니다, 당신은 확실히'C' 표준을 선언 전달할 수 있습니다 라이브러리 기능을 사용하여 해당 헤더 파일을 포함하는 요구 사항을 제거하지만 _recommended._ –

+1

@SouravGhosh가 아닌 것으로 생각합니다. 권장하지 않지만 일반적으로 작동하는 것은 내가 묻는 언어 변호사의 우스운 경우입니다! – Praxeolitic

답변

5

구조체의 전방 선언은 항상 C에서 허용됩니다. 그러나 이렇게 많은 형식을 사용할 수는 없습니다. 예를 들어 구조체의 태그 이름이 지정되지 않았기 때문에 FILE에 대한 전달 선언을 사용할 수 없습니다 (이론적으로 구조체가 아닐 수도 있습니다). 라이브러리 함수는 헤더에 정의 된 유형에 관계없이 선언 할 수 있음을 제공

, 그것은 또한 :

제 7.1.4 n1570 조 제 2 항은 기능과 동일한 기능을 수행 할 수있는 권한을 제공합니다 함수를 선언하고 해당 헤더 ( )를 포함하지 않고 사용할 수 있습니다.

다소 일반적인 것이 었습니다. 나는 여기서 추론하는 것은 하드 드라이브가 느리고, 더 적은 수의 #include은 컴파일 시간이 더 짧다는 것을 의미한다고 생각한다. 그러나 이것은 더 이상 1980 년대가 아니며, 우리 모두는 빠른 CPU와 빠른 하드 드라이브를 가지고 있습니다. 따라서 약간의 #include은 눈치 채지 못합니다.

void *malloc(size_t); 
void abort(void); 

/* my code here */ 
+0

struct의 forward 선언은 어떻게됩니까? – Praxeolitic

+0

@Praxeolitic : "구조체의 전달 선언은 항상 허용됩니다." –

+1

@Praxeolitic : OTOH, 구현 세부 사항이 지정된 표준 헤더에서 선언 된 구조를 알지 못합니다. 따라서 문제는 전혀 발생하지 않을 수 있습니다. 특정 구현에서 구조가 선언되는 방법을 파악한 경우이를 미리 선언 할 수 있습니다. – mafso

0

네이 완벽하다 할 수 모른다 유효한. 표준 라이브러리에서도이 작업을 수행 할 수 있습니다.

double atof(const char *); 

int main() { 
    double t = atof("13.37"); 
    return 0; 
} 

#include <stdio.h> 

비슷한 일이 구조체, 변수 등을 수행 할 수 있습니다

난 당신이 몇 가지 C 예제 기능 위키 페이지를 읽고 추천 할 것입니다 :이은에 지정된

http://en.wikipedia.org/wiki/Forward_declaration

을 C 표준, 섹션 7.1.4 n1570의 2 단

라이브러리 함수가 참조없이 선언 될 수 있다면 헤더에 정의 된 모든 유형에 관계없이 함수를 선언하고 연관된 머리글을 포함하지 않고 사용할 수 있습니다.

+1

글쎄, 질문은 표준 라이브러리 함수에 관한 것입니다. –

+1

'fopen()'에 대한 선언이 이미 있다는 것을 의미하는''에있는'FILE'에 대한 선언이 필요하기 때문에'fopen()'선언은 유용하지 않습니다. –

+0

사실이 대신 선언문을 atof()로 작성했습니다. –

관련 문제