문제

내가 사용하는 이전 스타일의 C 고 그리고 최근에는 탐구하기 시작했 c99 특징이다.나는 단지 하나의 질문:내 프로그램을 성공적으로 컴파일을 사용하면 c99 내 프로그램,c99 플래그로 gcc 와 링크에 그것을 사전 c99 라이브러리?

그래서,나는 오래된 C89 또는 진화?

도움이 되었습니까?

해결책

나는 그들이 그 점에서 호환 될 것이라고 믿는다. 그것은 당신이 컴파일하는 것들이 새로운 음식을 밟지 않는 한입니다. 예를 들어, 이전 코드에 포함 된 경우 enum bool { false, true }; 그럼 당신은 곤경에 처해 있습니다. 비슷한 공룡으로서, 나는 C99의 멋진 새로운 세계를 천천히 받아들이고 있습니다. 결국, 그것은 지금 약 10 년 동안 숨어있었습니다.)

다른 팁

해야 합니다.감사에 대한 듣기:-)

실제로,나를 확장할 것입니다.

당신은 맞는 C99 주변 되었습니다.당신 (제 생각에)것을 사용하는 것에 대한 표준 이외의 다른 레거시 코드(여기서 당신은 버그를 수정하기보다는 새로운 기능을 추가).그것은 아마도 그것을 가치가 없 레거시 코드에 대한 하지만 당신은(과 같이 모든 비즈니스 결정을)너의 자신의 비용/효과 분석.

나는 이미한 새로운드와 호환되는 의 c1x 의 동안 나는 사용하지 않는 어떤 새로운 기능의 아,나는지 확인 하려고 그것을 중단하지 않습니다.

무엇으로드를 위해 밖을 봐,저자의 표준을 호환성 심각합니다.그들의 일을 하지 않았을 디자인하는 새로운 언어 그것을 성문화의 기존 관행이다.

이 단계에서는 순간 그들은 좀 더 latitude 업데이트에서 언어 하지만 그들은 여전히 따르라의 측면에서 출력:"첫째,"전혀 해를 끼치하지 않는다.

일반적으로,코드가 깨진으로 새로운 표준,컴파일러가 강제로 드릴 말씀이 있습니다.그래서 단순히 컴파일 코드 기반이 될 것입니다 훌륭한 시작입니다.그러나,당신이 읽 C99 근거 문서, 표시 문구"조용한 변경"나타나-이것은 당신이 무엇을 조심해야 한다.

이들은 행동의 변화에서 컴파일러는 필요하지 않습에 대한 정보를 수와의 원천이 될 수 있습 많은 불안과 이를 갊이 있으리라면 응용 프로그램상한 행동을 시작합니다.에 대해 걱정하지 마십시오"조용한에서 변경 c89"비트의 경우 그들은 problerm,당신은 이미 물린 것이다.

는 문서,방법에 의해 다양한 읽는 이유를 이해하는 실제적인 표준을 말한다 무엇을 말한다.

공손히: 그것을 시도하고 알아보십시오. :-)

그러나 몇 가지 미니어 컴파일 차이를 해결해야하더라도 움직일 가치가있을 것입니다.

명시 적 C99 기능을 위반하지 않으면 C90 코드는 다른 이전 C99 라이브러리와 함께 C99 플래그가 작동합니다.

그러나 C89에는 DOS 기반 라이브러리가 있으며, 확실히 작동하지 않을 것입니다.

C99는 훨씬 유연하므로 자유롭게 마이그레이션하십시오 :-)

C 라이브러리 간의 전화 규칙은 오랜 세월 동안 변하지 않았으며 실제로는 확실하지 않습니다.

이 시점에서 운영 체제는 C API가 OS 조각 사이의 접착제 인 경향이 있기 때문에 C 호출 규칙에 크게 의존합니다.

따라서 기본적으로 대답은 "예, 바이너리는 거꾸로 호환됩니다. 아니요, 자연스럽게 C99 기능을 사용하는 코드는 나중에 비 C99 컴파일러로 컴파일 할 수 없습니다."

그것은 거꾸로 호환되기위한 것입니다. 많은 공급 업체가 이미 구현 한 확장을 공식화합니다. C99로 컴파일 할 때 잘 쓰여진 프로그램에 문제가 없을 수도 있습니다.

내 경험에 따르면, 시간을 절약하기 위해 일부 모듈을 다시 컴파일하고 다른 모듈을 다시 컴파일합니다 ... 많은 시간을 낭비합니다. 일반적으로 새로운 컴파일러가 모두 호환되도록 쉽게 간과되는 세부 사항이 있습니다.

C89 표준의 일부 부분이 모호하게 작성되어 있으며, 포인터 유형과 액세스하는 객체에 대한 규칙을 해석하는 방법에 따라 표준은 두 가지 매우 다른 언어 중 하나를 설명하는 것으로 볼 수 있습니다. 그 중에는 의미 적으로 훨씬 강력하고 결과적으로 더 넓은 범위의 필드에서 사용 가능하며, 그 중 하나는 컴파일러 기반 최적화를위한 더 많은 기회를 허용합니다. C99 표준은 많은 분야에서 압도적으로 선호 되었음에도 불구하고 이전 언어와의 호환성을 의무화하려는 노력을 기울이지 않는다는 규칙을 "명확하게"했다. 또한 C89에서 정의 된 일부 사항으로 취급하지만 C89 규칙이이를 금지하기에 충분히 쓰여지지 않았기 때문에 (예 : memcpy 목적지에 힙이있는 경우 유형 punning의 경우).

따라서 C99는 저자가 C89에 의해 설명 된 언어와 호환 될 수 있지만 1990 년대 내내 대부분의 C89 컴파일러가 처리 한 언어와 호환되지는 않습니다.

일부 C89 기능은 유효한 C99가 아닙니다

아마도 이러한 기능은 역사적 이유로 만 존재하며 현대 C89 코드에서 사용해서는 안되지만 존재합니다.

C99 N1256 표준 초안 서문 단락 5는 C99를 기존 개정판과 비교하며, 제한보다 훨씬 더 많은 확장을 가지고 있지만 비 호환성을 검색하기에 좋은 장소입니다.

암시 적 INT 리턴 및 가변 유형

Lutz가 언급 한 의견에 언급되었습니다. 예를 들어 다음은 유효한 C89입니다.

static i;
f() { return 1; }

그러나 C99가 아니라 다음을 작성해야합니다.

static int i;
int f() { return 1; }

이것은 또한 C99의 프로토 타입없이 함수 호출을 배제합니다. C89, C90 또는 C99의 모든 기능에 프로토 타입이 필요합니까?

N1256 말한다 :

암시 적 int를 제거하십시오

비 공극 함수에 대한 표현이없는 반환

유효한 C89, 유효하지 않은 C99 :

int f() { return; }

C89에서 구현 정의 값을 반환한다고 생각합니다. N1256 말한다 :

값을 반환하는 함수에서 허용되지 않는 표현식없이 반환

음의 피연산자가있는 정수 분할

  • C89 : 구현 정의 방향으로 반올림합니다
  • C99 : 라운드에서 0

컴파일러가 반올림 된 경우 -inf, 그리고 당신은 해당 구현 정의 된 동작에 의존했으며, 이제 컴파일러가 C99에서 코드를 중단해야합니다.

https://stackoverflow.com/a/3604984/895245

N1256 말한다 :

신뢰할 수있는 정수 부서

Windows 호환성

Microsoft 이후 C99를 너무 빨리 구현하려고하지 않습니다.

예를 들어 Libgit2의 이유입니다 한계는 C99 기능을 허용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top