2013-12-19 3 views
4

나는이 C 코드를 이해하려고 노력 중이다. (프로그램의 기능적 목표를 달성하려고 시도하지는 않는다.) 이것은 gcc를 사용하여 컴파일합니다. 이 메인은 main (int a, char * argv []) 형식입니까? 인수와 함수 본문 (char * a와 유사)을 선언 할 수 있습니까?프로그램이 컴파일되는 이유는 무엇입니까?

#include <stdio.h> 
main(u,_,a) 
    char 
    *a; 
{ 
    //printf("%s\n",_,a);//just to help debugging 
    //printf("%d\n",u); //just to help debugging 
} 
+1

은 사전 C89 스타일의 기능처럼 보인다. – chux

+1

답변을 얻지 못하는 재미있는 사실을 추가하려면 : 16 비트 부팅 프로그램을 작성할 때이 스타일의 함수 선언을 사용해야했습니다. gcc는 16 비트로 컴파일되지 않으므로 ANSI를 지원하지 않는 bcc (Bruce의 C 컴파일러)를 사용해야했습니다. 그래서 당신은 실제로 일부 분야 에서이 물건을 실행할 수 있습니다! – Guido

답변

4

이것은 C 함수를 작성하는 구식의 오래된 방법입니다.

C 조의 조상 언어에는 유형이 없습니다. 모든 변수에는 기계어가 포함되어 있습니다. seminal book about C이 (브라이언 커니 핸과 데니스 리치가) 변수 선언 닮은 형태의 유형을 추가 한의 저자에서 "K & RC"로 알려진

main(u, _, a) { 
    /* ... some code ... */ 
} 

C as it used to be를, 그리고 : 그래서 함수 정의는 다음과 같이 시작하는 것입니다 함수 매개 변수 목록과 함수 코드 사이에있었습니다. 일종 int & 인 경우 K R에 C

int main(u, _, a) 
    int u; 
    int _; 
    char *a; 
{ 
    /* ... some code ... */ 
} 

은 다음 여러 곳에서 생략 할 수있다. 함수 매개 변수의 경우 유형 선언 행을 모두 생략 할 수 있습니다.

int main(u, _, a) 
    char *a; 
{ 
    /* ... some code ... */ 
} 

ANSI C은 1989 년에 표준화와 주요 혁신 중 하나는 함수 프로토 타입이었다. 적절한 ANSI C에서는 사용하기 전에 모든 함수를 선언하고 모든 인수의 유형을 선언합니다.

int main(int u, int _, char *a) 
{ 
    /* ... some code ... */ 
} 

컴파일러는 여전히 레거시 코드 용 이전 양식을 지원합니다. (그들이 1989 C 표준을 준수한다면, 그들은해야만합니다.) 20 년이 넘게 지나간 레거시 코드는별로 없기 때문에 그러한 코드를 자주 찾을 수 없습니다.

(이 main에 대한 올바른 형식이 아닙니다. 나는 GCC 그것에 대해 경고합니다 생각하지만 경고 설정을 설정해야 할 수도 있습니다.)

-1

이것은 잘못된 형태의 main입니다. 이것은 C99/C11에서는 유효하지 않지만 C90에서는 유효하지 않습니다. (유효한 선언은 C90에서 main의 유효한 선언은 5.1.2.2.1을 참조하십시오).

+0

그래서 "왜 GCC가 지나치게 관대하기 때문에"아직 컴파일하지 않는가에 대한 대답이 있습니다. –

+0

@ H2CO3 (보통 때) – ouah

+0

기술적으로는 사실이지만, 이것은 대단히 도움이되지 않으며 컴파일러가 그러한 잘못된 코드를 받아들이는 이유에 대한 질문에 대답하지 않습니다. – Gilles

3

난독 화를 제외하고 아무도 더 이상 사용하지 않는 오래된 선언입니다 (trigraphs 참조!). 나는 이것이 새로운 C 표준 하에서는 불법이라고 생각하지만, gcc는 이전 버전과의 호환성을 위해 그것을 여전히 지원한다.

작동 방식은 유형이 함수 아래에 나열되고 반환 유형이 해제되어 있습니다. 반환 유형 없음은 기본값이 int임을 의미합니다. 일반적인 주 함수는 다음과 같이 작성할 수 있습니다.

main(argc, argv) 
    int argc; 
    char** argv; 
{ 
    printf("%d\n", argc); 
    return 0; 
} 

여는 중괄호 앞에 다른 변수를 선언 할 수 없습니다. int c;을 추가 시도하고이 오류 : 인수 목록과 함수 본문 사이

test.c:4: error: declaration for parameter ‘c’ but no such parameter 
4

선언은 소위 K & R C (C의 첫 번째 버전)의 일부였다. 그래서 네 컴파일러가 K & R 코드를 컴파일 할 수 있다면 유효합니다. 그들의 각 하나를 포함하는,

int main (int argc, char *argv[], char *envp[]); 

문자열에 대한 포인터의 배열 인 세 번째 인수 :

소개 main() 네, 사실, 주요 최대 세 개의 인수를 가질 수 있습니다 ... 두 개 이상의 인자를 가진 환경 변수 정의 (name=value 형식의 문자열)

관련 문제