2012-06-23 1 views
1

K & R 스타일 함수 정의 컴파일하여 g ++

int foo(a) 
    int a; 
{ 
    ... 
} 

그램 ++ 제공 및 오류 것 같은 오래된 스타일의 함수 정의 사용하는 C 파일을 컴파일 : '는이'이 범위에서 선언되지 않았습니다합니다. gcc가 이것을 해석 할 수 있습니다. g ++에서이를 인식하도록 할 수 있습니까?

이것은 c와 C++ 파일을 혼합하여 컴파일하기 때문에 문제가됩니다. 이와 관련된 혼합 소스를 빌드하는 표준 연습은 무엇입니까? 모든 파일 또는 cc 파일에서만 g ++을 실행 하시겠습니까?

+5

안녕하세요 여러분도 g ++ 컴파일 방법을 제안 할 수 있습니까 ??? –

+0

1989 년 이래로 손대지 않은 코드를 실제로 사용하고 있습니까? – kay

+1

@kay : 실제로 K & R 함수 정의를 사용하는 깨진 코드가 수없이 많습니다. 대부분은 오래된 BSD 또는 Sun에서 파생 된 소프트웨어에 있습니다. 일부 오래된 GNU 소프트웨어에도이 소프트웨어가 있습니다. –

답변

11

Is there a way to let g++ recognize this?

이 구문은 C++에서 지원되지 않습니다, 전자는 (문자 [4] = "네"예를 들어) 편리하지만 때문에 C와 C++ 사양 사이의 불일치의 나에게 몇 가지 문제가 점점 유지합니다.

Running g++ on all files or only the cc files?

GCC의 워드 프로세서에서 Compiling C++ programs :

C++ source files conventionally use one of the suffixes .C', .cc, .cpp, .CPP, .c++, .cp, or .cxx; C++ header files often use .hh, .hpp, .H, or (for shared template code) .tcc; and preprocessed C++ files use the suffix .ii. GCC recognizes files with these names and compiles them as C++ programs even if you call the compiler the same way as for compiling C programs (usually with the name gcc).

However, the use of gcc does not add the C++ library. g++ is a program that calls GCC and treats .c, .h and .i files as C++ source files instead of C source files unless -x is used, and automatically specifies linking against the C++ library. This program is also useful when precompiling a C header file with a .h extension for use in C++ compilations.

그래서 두 가지 가능성 :

  1. C 파일에 대한 실행 gcc 및 C++ 파일에 g++.
  2. 모든 파일에 gcc을 실행하십시오.

두 경우 모두 g++ (또는 gcc -lstdc++)으로 연결해야합니다.

+2

정교하게 - C++ 컴파일러를 사용하는 경우 C++ 코드를 컴파일해야합니다. 모든 C 코드가 합법적 인 C++ 코드는 아닙니다. – templatetypedef

+1

* 차이는 거의 없습니다. * 실제로는 매우 중요합니다. 컴파일 할 때 실행 파일'g ++'은 C++ 언어를 강제하며, 실행 파일'gcc '는 파일의 확장자 (C와 C++를 컴파일 할 수 있음)에 따라 언어를 결정합니다. 링커를 호출 할 때. 즉, 질문에 대한 대답은 항상'g ++ '를 호출하는 대신'gcc'를 호출하고 링커 명령을 수정해야한다는 것입니다. –

+1

** C 코드가 C++ **가 아니고 ** C++ 컴파일러 **로 컴파일 할 수 없다는 점은 충분히 강조 할 수 없습니다. 컴파일이 성공하더라도 코드가 예상대로 작동한다는 보장은 없습니다. 같은 코드가 C와 C++에서 서로 다른 의미를 갖는 경우가 많이 있습니다. C++ 컴파일러로 C를 컴파일하는 것이 유효한 유일한 방법은 코드가 C와 C++의 공통점 인 (아주 못생긴) 언어로 작성되었다는 것을 아는 것입니다. OP는 K & R 함수 정의가 포함 된 코드를 다루기 때문에 분명히 그 클래스에는 없습니다. –

4

정확함 : C++은 구식 함수 정의를 지원하지 않습니다.

C 컴파일러 (예 : gcc)를 사용하여 C 컴파일.

C++ 컴파일러 (g ++ 등)를 사용하여 C++를 컴파일하십시오.

두 가지 다른 언어입니다. C++의 extern "C" 기능을 사용하여 C++에서 C 코드를 호출 할 수 있으며 그 반대의 경우도 가능합니다. 자세한 내용은 C++ FAQ Lite의 32 항을 참조하십시오.

+0

+1 'extern "C"' – bitmask

2

C 및 C++ 모두를 컴파일하는 경우 g++ (항상 C++로 컴파일 됨)보다 gcc (항상 파일 확장명을 기반으로 언어를 선택)으로 컴파일하는 것이 좋습니다. g++이 자동으로 추가되지만, gcc이 아닌 C++ 표준 라이브러리 (및 사용하는 경우 -lm)를 포함하도록 링커 옵션을 변경해야합니다.

또는 C++의 경우 g++을 호출하고 C 파일의 경우 gcc을 호출하는 것이 더 좋습니다. 빌드 시스템을 구성하여 관리하기가 너무 어렵지 않아야합니다.

+1

g ++을 링크 용으로, gcc를 컴파일 용으로 사용할 수 있습니다 ... –