2016-07-13 4 views
1

소스 파일의 일부분 만 C 또는 C++ 언어 표준을 적용 할 수 있습니까? 소스 파일이 C90과 호환되는지 확인하려고하지만 C99가 필요한 일부 헤더에 따라 다릅니다. 이러한 헤더의 준수는 당분간 중요하지 않습니다 (당분간 C99로 컴파일 할 수 있습니다).하지만 앞으로는 더 제한적인 플랫폼으로 코드를 이식하는 데 필요한 노력을 최소화하고 싶습니다.소스 파일의 일부분에만 언어 표준을 적용 하시겠습니까?

간단히 말해, 포함 된 헤더를 제외하고 전체 파일에 적용 할 언어 표준을 원합니다. 헤더 포함이 C 및 C++에서 작동하는 방식을 감안할 때 일반적인 문제는 주어진 소스 파일의 임의의 부분에 언어 표준을 적용하는 것이라고 생각합니다.

저는 특히 GCC에서 일하고 있습니다. 다른 컴파일러 (msvc, clang)에서도 가능하면 궁금합니다.

+0

하지만 전체 파일과 관련된 내용, 원본 파일 간의 "상호 작용"및 전체 프로그램에 대한 표준이 있습니다. 소스 코드 파일의 일부가 자체 진공 상태로 존재하지 않습니다. – deviantfan

+0

그 요점은 무엇입니까? –

+0

@EugeneSh. - 표준 준수를 시행하기 위해 컴파일러를 사용하는 것이 아이디어입니다. C90을 따르기 위해 파일의 의존성을 모두 조사 할 수는 없더라도 개발중인 소스 파일이 이전 표준에서 지원되지 않는 언어 구문을 사용하지 않는다고 주장 할 수 있다면 유용 할 것입니다. –

답변

3

C99을 사용하는 헤더에 여전히 의존하면서 코드가 C90과 호환되는지 확인하려면 GCC 경고 플래그 -Wc90-c99-compat을 활성화 할 수 있습니다. 이렇게하면 C99 기능을 사용할 수 있지만 C90에서 사용할 수없는 기능을 사용할 때마다 경고가 표시됩니다. 헤더 파일 (아마도 올바른)에서 이러한 경고가 발생하지 않도록하려면 파일을 포함시킨 후에 pragma를 사용하여 경고를 사용하십시오.

이것은 기본적으로 원하는 것을 얻을 수 있습니다. 지정한 코드에 대해서만 경고가 발생합니다. 연타 대부분 호환,

#pragma GCC diagnostic error "-Wc90-c99-compat" 

를 지금까지 내가 아는 한,하지만 MSVC는 정말 잘 그래서 당신이있어 시작하는 C99을 지원하지 않습니다

#include "myheader.h" 

#pragma GCC diagnostic warning "-Wc90-c99-compat" 

void func(void) { ... } 

엄격한 버전을 사용하는 것입니다 스스로.

+0

내 문제를 직접 해결하므로 (코드의 임의 섹션에 대한 호환성 문제에 대한 경고/오류) 직접 승인 된 것으로 표시합니다. Jesper Juhl에게 사과합니다. Jesper Juhl의 답은 기술적으로 더 직접적으로 묻는 질문에 답합니다. –

+0

추가 정보 : 아이러니하게도 이것은 근본적으로 나의 문제를 해결할뿐입니다. 경고 플래그는 GCC 5 이상에서만 나타납니다. 플랫폼에서 슬프게도 사용할 수 없습니다. 그래도 경고를 활성화하고 최신 GCC로 컴파일을 테스트하여 규정 준수를 주장 할 수 있습니다. –

+0

@ JackO'Reilly : GCC 5가 아마 당신의 플랫폼에 곧 도착할 것입니다. –

3

아니요. 파일 (컴파일 단위)을 부분적으로 하나의 언어 표준으로 만들거나 부분적으로 만들 수 없습니다.

수 있습니다. 그러나 파일을 두 개의 파일로 분할하고 각기 다른 언어 표준을 사용하여 파일을 컴파일합니다. 두 파일을 나중에 모두 연결하도록 잘 정의되어 있는지 확인하십시오.

보다 나은 해결책은 모두 코드가 최신 또는 이전 언어 표준을 준수하는지 확인한 다음 사용하는 것입니다.

+0

대체 솔루션은 모든 코드를 이전 언어 표준으로 컴파일하고이를 사용하는 것입니다. 이는 C99 기능을 피하기 위해 헤더를 변환하는 것을 의미합니다. – Peter

+0

답변 해 주셔서 감사합니다. 필자는 파일을 두 개로 분할하는 것을 고려했으나 더 엄격한 규정을 준수하는 파일에 동일한 헤더를 포함시켜 동일한 문제가 발생하지 않을까요? –

+0

@Peter 물론, 이전 표준이나 최신 표준을 준수하도록 코드를 편집해야하는 경우, 비생산적인 목표를 달성하기 위해 앞으로 나아갈 것으로 보입니다. –

관련 문제