2013-08-27 2 views
2

C 및 IEC 61131 언어로 작성된 코드를 컴파일하는 독점 개발 환경을 사용하고 있습니다. C 컴파일의 경우,이 옵션을 빌드 GCC 4.1.2을 사용GCC 전 처리기 non-C 파일 실행

-fPIC -O0 -g -nostartfiles -Wall -trigraphs -fno-asm 

컴파일은 Cygwin에서 사용하는 윈도우에서 실행되는 프로그램에 의해 수행된다.

내 문제는 IEC 언어 전처리 기가 그다지 유용하지 않으며 (#define을 전혀 지원하지 않음) 매크로를 사용하고 싶다는 것입니다. GCC 전처리 기가 실제로 처리하는 언어 (타겟 언어는 구조화 된 텍스트)를 왜 신경 쓰는지 모르겠다. 그래서 다른 파일 형식의 파일을 처리하는 방법을 누군가가 알고 있는지 알고 싶다. 더 이상 컴파일되지 않습니다. (파일이 IEC 컴파일러를 실행하기 전에 매크로 확장을 찾고 있습니다). 저는 컴파일러 옵션과 환경을 잘 모르기 때문에 결코 대응할 필요가 없습니다. C 코드를 작성하면 마술처럼 컴파일되고 실행을 위해 타겟 시스템으로 전송됩니다.

내가 할 수있는 유일한 일은 빌드 옵션을 추가하고 실행하기 전에 배치 파일을 실행하는 것입니다. 내 최선의 희망은 특정 확장명의 모든 파일을 처리하는 배치 파일을 사용하여 거짓말을하지만 심지어 gnuinst 폴더에서 실행 파일을 통해 실행하는 데 사용할 플래그를 알려주지조차 모르겠다 생각합니다.

+1

중복 가능성을 [GCC의 전처리 (http://stackoverflow.com/questions/3917316/gcc-preprocessor) - C에 대해 이야기하지만 대부분 관련성이 없습니다. 원하는 소스 텍스트에'-E' 플래그를 사용하십시오. – Mat

+0

나는'gcc -E TestIn.txt -o TestOut.txt'를 시도했고 메시지를 받았다 : 연결이 완료되지 않았기 때문에 링커 입력 파일이 사용되지 않았다. TestIn.txt의 내용은 다음과 같습니다. #define ADDTHEM (x, y) ((x) + (y)) Test = ADDTHEM (2,3);'. 'Test = ((2) + (3)) ;; –

+0

GCC는 확장 기능을 기반으로 파일의 종류를 결정하는 재미있는 경험적 방법을 가지고 있으며 분명히'. txt'는 링커 지시자입니다. 그냥 C :'gcc -xc -E TestIn.txt'라고 말하십시오. – Mat

답변

3

gcc의 cpp을 포함한 거의 모든 C 프리 프로세서는 입력이 유효한 C 코드라고 가정합니다. C (또는 C++ 또는 Objective-C) 규칙에 따라 입력을 토큰 화해야합니다. 입력을 토큰 (보다 정확하게는 사전 처리 토큰)으로 해결해야했기 때문입니다. 토큰 레벨 이상의 구성은 문제가되어서는 안됩니다.

cpp 또는 gcc -E을 사용하여 C 소스 코드가 아닌 텍스트를 사전 처리 할 수 ​​있지만 일부 입력 구성은 문제를 일으킬 수 있습니다. 코멘트에서 예를 촬영

: 나는 GCC는 기본적으로 링커 입력 파일로 .txt 파일을 취급하기 때문에, gcc -E - < foo.txt보다는 gcc -E foo.txt을 사용했다

$ cat foo.txt 
#define ADDTHEM(x, y) ((x) + (y)) 
ADDTHEM(2, 3) 
$ gcc -E - < foo.txt 
# 1 "<stdin>" 
# 1 "<command-line>" 
# 1 "<stdin>" 

((2) + (3)) 

참고.

그러나 유효한 C 전처리 토큰으로 구성하지 않습니다 foo.txt에 일부 콘텐츠를 추가하는 경우, 당신이 가진 수있는 문제 :

$ cat foo.txt 
#define ADDTHEM(x, y) ((x) + (y)) 
ADDTHEM(2, 3) 
ADDTHEM('c, "s) 
$ gcc -E - < foo.txt 
# 1 "<stdin>" 
# 1 "<command-line>" 
# 1 "<stdin>" 

((2) + (3)) 
<stdin>:3:9: warning: missing terminating ' character [enabled by default] 
<stdin>:3:0: error: unterminated argument list invoking macro "ADDTHEM" 
ADDTHEM 

의 (a C 프리 프로세서에 에이다 소스 코드를 공급하기위한 시도는 이것으로 실행 한 에이다가 속성 구문 고립 아포스트로피에게 ' 문자를 사용하기 때문에 문제의 종류.) 입력 언어가 유효 C 전처리 토큰하지 않은 물건을 사용하지 않는 경우

그래서 당신이 그것을 할 수 있습니다.

사전 처리 토큰에 대한 자세한 내용은 C 표준의 섹션 6.4, the N1570 draft을 참조하십시오.

C 프리 프로세서 만 C, C++ 및 목표 - C 소스 코드와 함께 사용하기위한 것입니다 : 나는 밝히는는 GNU cpp manual을 확인하기 전에

는 사실 위를 썼다. 과거에는 일반 텍스트 프로세서 인 으로 악용되었습니다. C의 어휘적인 규칙을 지키지 않는 입력에 질식합니다. 예를 들어, 아포스트로피는 문자 상수의 시작으로 해석되어 오류를 발생시킵니다. 또한 입력의 특성을 그대로 유지하여 C- 제품군 언어에 중요하지 않은 것에 의존 할 수 없습니다. Makefile이 사전 처리되면 모든 하드 탭 이 제거되고 Makefile이 작동하지 않습니다.

그래서주의, 조립하지 C. 다른 알골 틱 프로그래밍 언어 (등, 파스칼, 에이다) 종종 안전 자주있는 일 에 CPP를 이용하여 멀리 얻을 수 있다고 말했다 가졌어요. `-traditional-cpp ' 모드는 공백을 더 많이 유지하며 그렇지 않은 경우 더 허용됩니다. 많은 문제는 자국어 설명 대신 C 또는 C++ 스타일 설명 을 작성하고 매크로를 간단하게 유지함으로써 피할 수 있습니다.

당신이 쓰고있는 언어에 맞는 전처리기를 사용해야합니다. 최신 버전의 GNU 어셈블러에는 매크로 기능이 있습니다. 대부분의 고급 프로그래밍 언어에는 자체적으로 조건부 컴파일 및 포함 메커니즘이 있습니다. 다른 모든 시도가 실패하면 은 GNU M4와 같은 진정한 일반 텍스트 프로세서를 사용해보십시오.

(즉 설명서의 저자는 분명히 에이다의 속성 구문으로 문제를 놓쳤다.)의

+0

cpp에 대한 대안으로 무엇을 권하고 싶습니까? 나는 PHP를 사용할 수 있지만 과도한 것으로 보인다. –