Как универсально C99 поддерживается?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
44
задан Stephen Kennedy 6 December 2017 в 20:21
поделиться

6 ответов

Если бы Вы хотите записать портативный код C, то я предложил бы, чтобы Вы записали в C89 (старый ANSI C стандарт). Этот стандарт поддерживается большинством компиляторов.

Intel C Compiler имеет очень хорошая поддержка C99 , и это производит быстрые двоичные файлы. (Спасибо 0x69!)

MSVC поддерживает , некоторые новые функции и Microsoft планируют расширить поддержку в будущих версиях.

GCC поддерживает некоторые новые вещи C99. Они составили таблицу о состояние функций C99 . Вероятно, самой применимой функцией C99 является массив переменной длины, и GCC поддерживает его теперь. Лязг (C LLVM, на который выходят), поддерживает большинство функций кроме прагм с плавающей точкой.

Википедия, кажется, имеет хорошая сводка поддержки C99 из компиляторов.

24
ответ дан KovBal 26 November 2019 в 22:15
поделиться

Кто-то упомянул, что компилятор Intel имеет поддержку C99. Существует также компилятор C/C++ Comeau , который полностью поддерживает C99. Это единственные, о которых я знаю.

функции C99, которые я не использую, потому что они не хорошо поддерживаются, включают:

  • массивы переменной длины
  • макросы с переменным количеством параметров.

функции C99, которые я регулярно использую, которые, кажется, вполне прилично поддерживаются (кроме Microsoft):

  • stdint.h
  • snprintf() - MS имеет нестандартное _snprintf(), который имеет серьезные ограничения не всегда пустой указатель, завершающий буфер и не указывающий, насколько большой буфер должен быть

Для работы вокруг неподдержки Microsoft, я использую общественное достояние stdint.h от MinGW (что я изменил, чтобы также работать над VC6), и почти общественное достояние snprintf() от Holger Weiss

Объекты, которые не поддерживаются Microsoft, но будут все еще использовать на других компиляторах в зависимости от проекта, включайте:

  • смешанные объявления и код
  • подставляемые функции
  • _Pragma() - это делает прагмы намного больше применимыми
16
ответ дан user 26 November 2019 в 22:15
поделиться

Для gcc, существует таблица со всеми поддерживавшими функциями . Это, кажется, что самой большой вещью, отсутствующей, являются массивы переменной длины. Большинством других недостающих возможностей являются проблемы библиотеки, а не функции языка.

7
ответ дан Torsten Marek 26 November 2019 в 22:15
поделиться

Взгляд состояние C99 suport для GNU для получения дополнительной информации на которых функции в настоящее время поддерживаются.

Sun Studio подразумевается для поддержки всей спецификации C99. Я никогда не использовал их, таким образом, я не могу подтвердить.

я не полагаю, что компилятор Microsoft поддерживает спецификацию C99 в целом. Они намного более фокусируются на C++ в данный момент

3
ответ дан Benoit 26 November 2019 в 22:15
поделиться

Microsoft, кажется, отслеживает стандарты C++, но не имеет никакой поддержки C99. (Они могут избирательно подойти к выбору некоторых функций, но, как могли говорить, избирательно подходили к выбору C++ 0x, где существует перекрытие.)

С Visual Studio.NET 2003, новым проектам включили опцию 'Compile C code as C ++ (/TP)' по умолчанию.

2
ответ дан Mike Dimmick 26 November 2019 в 22:15
поделиться

Компилятор IBM c поддерживает c99 при вызове как c99, но не при вызове как cc или xlc.

5
ответ дан 26 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: