2010-02-16 5 views
8

Есть ли разница, если я скомпилирую следующую программу с помощью c89 vs c99? Я получаю тот же результат. Есть ли разница между этими двумя?C89 vs c99 Компилятор GCC

#include <stdio.h> 

    int main() 
    { 
     // Print string to screen. 
     printf ("Hello World\n"); 
    } 

gcc -o helloworld -std=c99 helloworld.c 
vs 
gcc -o helloworld -std=c89 helloworld.c 
+5

«gcc -std = c89» и «gcc -std = c99» не полностью соответствуют соответствующим стандартам. Добавьте «-патентный» или «-патентный-ошибки», чтобы получить что-то, приближающееся к полному соответствию. –

ответ

6

В теории должно быть одно отличие. Использование «//» для разметки комментария не является частью C89, поэтому, если он правильно правил C89, это приведет к ошибке компилятора (с -ansi -pedantic, возможно, это возможно, но я не помню, чтобы конечно).

Это дает представление об общем характере: если программа компилируется как C89, она, как правило, также компилируется как C99 и дает точно такие же результаты. C99 в основном покупает вам некоторые новые функции, которых нет в C89, поэтому вы можете использовать (например) массивы переменной длины, которые не разрешены на C89.

Возможно, вам придется попросить соблюдения правил педантизма, чтобы увидеть все различия. C99 предназначен для стандартизации существующей практики, а некоторые из существующих практик - расширения gcc, некоторые из которых включены по умолчанию.

+2

+1, Хороший улов; '//' комментарии могут быть единственной частью C99, которую стоит взять. '-ansi -pedantic' вызывает ошибку:' main.c: 5: ошибка: ожидаемое выражение перед '/' token' –

+1

Я не вижу, как комментарии '//' более полезны, это всего лишь два меньше символов ... это похоже на то, что C должен использовать '.' для доступа к элементам указателей к структурам, а не' -> ', потому что он сохраняет типизацию. –

+0

@JoeD '//' комментарии фиксируют только строку, что означает, что они гораздо менее подвержены случайному захвату другим набором комментариев или вызывают проблемы. Кроме того, ваш аргумент о '.' является глупым; использование того же оператора для того, что является принципиально одной и той же операцией, вероятно, является хорошей идеей. – Alice

1

на этом форуме http://www.velocityreviews.com/forums/t287495-p2-iso-c89-and-iso-c99.html я нашел это:

резюме: 99 стандартизирован, имеет новые ключевые слова, новый материал массива, комплексные числа, функции библиотеки и такие. Больше компиляторов завершено c89, так как у них было все это время, чтобы сделать их такими.

A) ANSI X3.159-1989. This is the original 1989 C standard, dated December 1989, with Rationale. The main body of the language is described in section 3, and the "C library" -- stdio, functions, and so on -- in section 4.

B) ISO 9899:1990. This is the original ISO C standard. "ANSI" is the American National Standards Institute, so the international crowd have to have their own standards with their own, different, numbering system. They simply adopted ANSI's 1989 standard, removed the Rationale, and renumbered the sections (calling them "clauses" instead). With very few exceptions you can just add three, so that most of the language is described in section -- er, "clause" -- 6, and the "C library" part in section 7.

C) ISO 9899:1999. This is the newfangled "C99" standard, with its Variable Length Arrays, Flexible Array Members, new keywords like "restrict" and "_Bool", new semantics for the "static" keyword, new syntax to create anonymous aggregates, new complex-number types, hundreds of new library functions, and so on.

The new ISO standard was immediately "back-adopted" by ANSI. I have not seen any official "ANSI-sanctioned" claim about this, but given the usual numbering systems, I would expect this to be ANSI Standard number X3.159-1999. (The numbering system is pretty obvious: a standard, once it comes out, gets a number -- X. for ANSI, or just a number for ISO -- and a suffix indicating year of publication. An update to an existing standard reuses the number, with the new year.)

Although X3.159-1989 and 9899:1990 have different years and section numbering, they are effectively identical, so "C89" and "C90" really refer to the same language. Hence you can say either "C89" or "C90" and mean the same thing, even to those aware of all the subtleties.

There were also several small revisions to the original 1990 ISO standard: "Normative Addendum 1", and two "Technical Corrigenda" (numbered; giving Technical Corrigendum 1 and TC2). The two TCs are considered to be "bug fixes" for glitches in the wording of the standard, while NA1 is an actual "change". In practice, the TCs do not really affect users, while NA1 adds a whole slew of functions that people can use, so NA1 really is more significant. NA1 came out in 1994, so one might refer to "ISO 9899:1990 as modified by NA1" as "C94". I have seen it called "C95", too.

28
  • // комментарии не являются частью C89, но ОК в C99,
  • опадание main() без возврата каких-либо значение эквивалентно return 0; в C99, но не так в C89. Из N1256 (PDF), 5.1.2.2.3p1:

    If the return type of the main function is a type compatible with int , a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0.

Так что ваш код имеет неопределенное поведение в C89, а также определенное поведение в C99.

Смежные вопросы