2016-12-26 1 views
4

cpp을 광범위하게 사용하고 성공적으로 포트란 90으로 작성된 세계적으로 유명한 거대한 기상 예측 코드를 컴파일하려고합니다. PGI, Intel 및 gfortran과 함께 지금, 전문가들이 variadic 매크로의 수백 가지 경우를 추가 한 버전을 물려 받았습니다. Intel과 fpp을 사용합니다. 이는 아마도 Fortran 중심이므로, 모두 작동하도록 할 수 있습니다. gfortran을 사용해야하고 cpp을 새로 추가하여이 코드에서 작동하지 못했습니다. 다음과 같이포트란 가변성 매크로 (더하기 포트란 // 연결)의 CPP/GPP

문제의 총 단순화입니다 -

코드 전처리 :

PRINT *, "Hello" // "Don" 
#define adderv(...) (myadd(__VA_ARGS__)) 
    sumv = adderv(1, 2, 3, 4, 5) 

는 가변 인자 매크로를 처리 할 -traditional 옵션을 사용하지 않고 CPP를 사용하지만 포트란 연결 :

$ cpp -P t.F90 
    PRINT *, "Hello" 
    sumv = (myadd(1, 2, 3, 4, 5)) 

반면에 -traditional 플래그 한 병합을 DLE 사용 아닌 가변 인자 매크로 : 정말 모두의 처리를 용이하게 할 수있는 방법을 찾기 위해 사투를 벌인거야

$ cpp -P -traditional t.F90 
t.F90:2:0: error: syntax error in macro parameter list 
#define adderv(...) (myadd(__VA_ARGS__)) 
^ 
    PRINT *, "Hello" // "Don" 
    sumv = adderv(1, 2, 3, 4, 5) 

.

나는 gpp으로 게임을 시작했으며, 가까이 다가 가고 있다고 느끼지만 현실은 여전히 ​​해결책에서 먼 길일 수 있습니다. ...을 허용하지 않으며 __VA_ARGS__을 확장하지 않습니다. 물론, 다음 날 같은 가능성이 파업라도 더 ...

PRINT *, "Hello" // "Don" 
#define adderv() (myadd(__VA_ARGS__)) 
    sumv = adderv(1, 2, 3, 4, 5) 



$ gpp t.F90 
    PRINT *, "Hello" // "Don" 
    sumv = (myadd(__VA_ARGS__)) 

내가 아무 소용 웹, 그리고 내가 지금까지 본 최고의 가능성을 샅샅이 한 가변 인자 매크로는 정말 아니다 추악하고 고통스러운 것은 모든 Fortran 연결 연산자를 분리 된 행으로 분리하는 것입니다. 즉

PRINT *, "Hello" // "Don" 

은 CPP와 GPP의

PRINT *, "Hello" /& 
&   /"Don" 

내장되어 나에게 협박 조금이된다, 그러나 아무도 성공 가능성을보고 올바른 방향으로 날 지점 수 있다면, 나는 것 매우 감사합니다. 이 거대한 코드를 재구성하는 것은 실제로 선택 사항이 아닙니다. 자동화 된 전략 (예 : 해당 연결 연산자를 별도의 줄로 나누는 것)이 필사적이면 필자가 될 수 있습니다.


추가 정보 - roygvib는 -C 플래그를 추가해볼 것을 제안했습니다. 우리는 요즘 Fortran 코드에 많은 C 코멘트를 삽입 한 것으로 보였으므로이를 막았습니다.또한

$ cat t.f90 
     PRINT *, "Hello" // "Don" 
    #define adderv(...) (myadd(__VA_ARGS__)) 
     sumv = adderv(1, 2, 3, 4, 5) 

내가 -P 및 -C 플래그로 호출, 자연적으로는 C++ (포트란 CONCAT 연산자)를 통과하지만, : 글쎄, 내가 나서서이 문제를했는데, 내가 더 가까운 것 같아요 저작권의 추가는 CPP의 비교적 새로운 "기능"이 될 수 있음을 시사한다

$ /lib/cpp -P -C t.F90 
    /* Copyright (C) 1991-2014 Free Software Foundation, Inc. 
     This file is part of the GNU C Library. 
    . 
    . 
    . 
    /* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15)/  Unicode 6.0. */ 
    /* We do not support C11 <threads.h>. */ 
     PRINT *, "Hello" // "Don" 
     sumv = (myadd(1, 2, 3, 4, 5)) 

연구 (Remove the comments generated by cpp)의 조금 : 일부 C-주석 저작권 텍스트를 생성하는 것 같다.

위와 같이 cpp를 호출하는 래퍼 스크립트 (예 : mycpp)를 작성해야하는 경우 C 모양의 주석을 필터링 한 다음 그것을 다음 단계로 전달합니다.

이 패키지 전체에 C 코드가 있기 때문에 약간 좋지는 않습니다. 이론적으로는 최악의 상황은 사전 처리 된 C 코드에서 주석을 생성하지 못하는 것입니다.

누구든지 내가 저작권 메시지의 생성을 단순히 어떻게 억제할지에 대한 지식이 있다면, 나는 사업에 종사하고 있을지 모릅니다.

+1

-C 옵션 (cpp -P -C)을 첨부하면 도움이 될 수 있습니다 ...? – roygvib

+0

실제로 원하는 코드가 생성되지만 문제는 헤더로 C 스타일 주석을 많이 생성한다는 것입니다. 아마도 그 부분을 억제 할 수있는 방법을 찾을 수 있을까요? – DonMorton

+0

원하지 않는 생성 된 주석을 억제하는 한 가지 방법은'cpp'의 소스를 수정하고 원하는 것을 수행하는 고유 한 버전을 빌드하는 것입니다. –

답변

1

적어도 아래에 설명 된 간단한 예제의 맥락에서 나는 이전 cpp를 설치하여이 문제를 해결했습니다. Other research은 버전 4.8이 사전 처리 된 Fortran 코드에 추가 C 주석을 삽입했음을 확인했으며, 이는 분명히 좋지 않습니다. 해결책은 간단 했으므로 cpp-4.7을 사용하십시오.

설치 (우분투 16.04에서)는 예상보다 간단했습니다. 간단한

sudo apt-get install cpp-4.7 
put the necessary executable in /usr/bin/cpp-4.7 

그리고 내가 원하는대로 다음 예제를 전처리합니다.

$ /usr/bin/cpp-4.7 -C -P t.F90 
    PRINT *, "Hello" // "Don" 
    sum = (myadd(1, 2, 3, 4, 5))