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 코드에서 주석을 생성하지 못하는 것입니다.
누구든지 내가 저작권 메시지의 생성을 단순히 어떻게 억제할지에 대한 지식이 있다면, 나는 사업에 종사하고 있을지 모릅니다.
-C 옵션 (cpp -P -C)을 첨부하면 도움이 될 수 있습니다 ...? – roygvib
실제로 원하는 코드가 생성되지만 문제는 헤더로 C 스타일 주석을 많이 생성한다는 것입니다. 아마도 그 부분을 억제 할 수있는 방법을 찾을 수 있을까요? – DonMorton
원하지 않는 생성 된 주석을 억제하는 한 가지 방법은'cpp'의 소스를 수정하고 원하는 것을 수행하는 고유 한 버전을 빌드하는 것입니다. –