2008-11-12 4 views
2

C/C++에서 여러 플랫폼을 지원하려면 전 처리기를 사용하여 조건부 컴파일을 사용하십시오. 예 :Ada에 전처리 기가 있습니까?

#ifdef _WIN32 
    #include <windows.h> 
#endif 

Ada에서 어떻게 할 수 있습니까? Ada에는 전 처리기가 있습니까?

답변

5

귀하의 질문에 대한 대답은 아니오입니다. Ada에는 언어에 내장 된 전처리 기가 없습니다. 즉, 각 컴파일러에는 하나의 컴파일러가있을 수도 있고 없을 수도 있으며 사전 처리 및 조건부 컴파일과 같은 사항에 대해서는 "통일 된"구문이 없습니다. 이것은 의도적이었습니다. 그것은 Ada 정신에 "해로운"것으로 간주됩니다.

전처리 기가 거의 없기 때문에 항상 솔루션이 약간 번거로울 수 있습니다. 예를 들어, 플랫폼 별 기능을 '별도'로 선언 한 다음 빌드 도구를 사용하여 올바른 도구를 컴파일 할 수 있습니다 (프로젝트 시스템, 플러그 인 바디 교체 또는 아주 간단한 디렉토리 시스템 사용). 모든 Windows 파일 in/windows /와/linux /에있는 모든 linux 파일에 해당 플랫폼을위한 적절한 디렉토리가 포함되어 있습니다).

GNAT는 가끔 전처리기를 필요로하고 gnatprep을 만들었다는 것을 깨달았습니다. 그것은 컴파일러에 관계없이 작동해야합니다 (하지만 빌드 프로세스에 삽입해야합니다). 비슷하게, 간단한 컴파일 (조건부 컴파일과 같은)의 경우에는 C 프리 프로세서를 사용하거나 아주 간단한 간단한 프로세서를 사용할 수도 있습니다.

3

CPP 전처리 기나 m4는 명령 줄의 모든 파일에서 호출하거나 make 또는 ant와 같은 작성 도구를 사용하여 호출 할 수 있습니다. .ada 파일을 다른 것으로 부르는 것이 좋습니다. 나는 java 파일에 대해이 작업을 수행했다. 나는 java 파일을 .m4라고 부르고 make 규칙을 사용하여 .java를 만든 다음 정상적인 방법으로 빌드한다.

도움이 되었기를 바랍니다.

+0

Ada 컴파일러가 처리 한 소스와 소스가 다르기 때문에 코드 디버깅에 문제가 발생하지 않습니다. –

+0

m4 매크로를 지능적으로 빌드하고 선택한 분기가 주석 처리되지 않은 상태에서 비공개 분기 및 매크로 호출을 주석 처리 된 블록에 유지하도록 할 수 있습니다. 이렇게하면 소스와 컴파일러 출력이 디버깅 목적으로 일치합니다. –

4

AdaCore는 Ada를 전문으로하는 gnatprep 전처리기를 제공합니다. 그들은 gnatprep이 "특별한 GNAT 기능에 의존하지 않는다"라고 말합니다. 따라서 GNAT가 아닌 GNU Ada 컴파일러에서 작동해야하는 것처럼 들립니다. 사용자 가이드는 조건부 컴파일 advice도 제공합니다.

나는 ".m4s"와 ".m4b"라는 접미사가 붙은 Ada 스펙과 본문 파일을 사용하여 m4가 사용 된 프로젝트에 참여했다.

내 전제 조건은 전처리를 완전히 피하고 특수 바디를 사용하여 CM 및 설정 프로세스를 설정하여 관리하는 것입니다.

+0

우리는 실제로 각 플랫폼 (옵션 아님)마다 하나씩 두 개의 컴파일러를 사용하고 있습니다. GNAT도 그 중 하나지만 컴파일러에서 작동 할 수있는 무언가가 있기를 바랬습니다. – paxos1977

+0

"조언"은 훌륭합니다. 고맙습니다! 다중 플랫폼 ADA 프로그램에서 내 관점을 바꿨습니다. –

1

아니요.

정말로 원한다면 하나를 얻는 방법이 있습니다 (C를 사용하고, 독립형을 사용하는 등). 그러나 나는 그것에 반대 할 것입니다. 하나도 갖지 않는 것이 의도적 인 디자인 결정이었습니다. 전처리 기의 전체 개념은 매우 유익하지 않습니다.

C의 전 처리기가 사용되는 대부분의 기능은 Ada에서보다 안정적인 방식으로 수행 할 수 있습니다. 유일한 예외는 크로스 플랫폼 지원을 위해 소스 파일을 약간 변경하는 것입니다. 전형적인 크로스 플랫폼 C 프로그램에서 이것이 얼마나 많이 남용되었는지를 감안할 때, 나는 Ada에서 그것을 지원하지 않는다는 것이 여전히 행복하다. C/C++ 개발자 중 일부는 변경 사항을 "사소한"상태로 유지할 수 있습니다. 그 결과는 효과가있을 수 있지만 인간이 읽는 것은 거의 불가능합니다.

이 작업을 수행하는 일반적인 방법은 서로 다른 코드를 다른 파일에 넣고 빌드 시스템을 사용하여 컴파일시에 선택하는 것입니다. make는 이것을 수행하는 데 충분한 충분히 강력합니다.

2

일부 오래된 Ada1983 시대 컴파일러에는 Ada를 생성하기위한 전처리 언어로 Ada의 #prefixed 하위 세트 (빌드 타임으로 해석 됨)를 사용하는 a.app이라는 패키지가 있습니다 (컴파일시 컴퓨터 코드로 변환되어야 함). -시각). Rational의 Verdix Ada Development System (VADS)은 여러 Ada 컴파일러 중 a.app의 조상으로 보입니다. 예를 들어 Sun Microsystems는 VADS에서 Ada SPARCompiler를 파생 시켰으므로 a.app도 사용했습니다. 이것은 IBM이 PL/I의 전처리기로 PL/I를 사용하는 것과는 다릅니다. http://dlc.sun.com/pdf/802-3641/802-3641.pdf

1

예, 그것은이 있습니다

제 2 장 a.app 같은 모습의 일부 문서입니다.

이 경우

#if SOMESWITCH then 
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration 
#end if; 

같은 일부 조건부 컴파일 스위치를 정의 할 수는 GNAT 컴파일러를 사용하는 경우, 당신은 전처리 작업을 수행하는 gnatprep를 사용하거나 GNAT 프로그래밍 Studio를 사용하는 경우 프로젝트 파일을 구성 할 수 있습니다 gnatmake 또는 gprbuild을 사용할 수 있으므로 직접 gnatprep을 실행할 필요가 없습니다.

예를 들어 여러 다른 OS에서 동일한 코드를 다른 크로스 컴파일러로 컴파일해야하는 경우에 매우 유용합니다.