То, как я включаю C++, разработало комментарии в gcc, в то время как отъезд ANSI включил?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

19
задан Paŭlo Ebermann 23 August 2011 в 18:01
поделиться

6 ответов

На недавних выпусках gcc, -ansi документируется как совпадающий с -std=c89. Новый синтаксис комментария только доступен со стандартом C99, таким образом -std=c99 позволил бы его.

существует также -std=gnu89, который совпадает с -std=c89, но позволяющий все gcc расширения (включая синтаксис комментария в стиле С++, который был расширением GNU задолго до того, как он был добавлен к стандарту).

Также смотрят эти -pedantic флаг, который мог дать Вам некоторые полезные предупреждения.

Ссылки:

26
ответ дан 30 November 2019 в 02:29
поделиться

Если Вы хотите использовать стиль C++, комментирует просто, потому что Вы хотите прокомментировать блоки и страдать от головной боли о вложении/*... */, можно использовать эту технику:

#if 0
... code ...
#endif

, который на самом деле также сделает задание.

19
ответ дан 30 November 2019 в 02:29
поделиться

Можно использовать-lang-c-c ++-comments препроцессор, чтобы иметь и режим ANSI и комментарии в стиле С++.

gcc -Wp,-lang-c-c++-comments -c source.c
14
ответ дан 30 November 2019 в 02:29
поделиться

C имел комментарии стиля C++ в течение почти десяти лет теперь, возможно, необходимо ли обновить?

-7
ответ дан 30 November 2019 в 02:29
поделиться

Если вы используете -ansi только для проверки совместимости, тогда проще всего будет подготовить целевой сценарий или make-файл, который копирует полное дерево исходных текстов в папку "ansi", удаляя // комментарии. В псевдо-bash:

SRC=main.c blip.c blip.h
cp makefile ansi-src/
for F in $SRC do
# does not handle // in string literals or /**/ comments!
sed 's/\/\/.*//g' < $F >ansi-src/$F
done
cd ansi-src
make CFLAGS=-ansi

Если ваш SCC поддерживает это, это также можно превратить в фиксацию, которая автоматически создает код на выделенной машине в режиме ANSI после каждой фиксации и отправляет вам отчет об этом по почте.

3
ответ дан 30 November 2019 в 02:29
поделиться

Боюсь, что создание сценария для какой-нибудь утилиты для перезаписи комментариев (как предлагает Лютер Блиссетт) может быть вашим единственным вариантом здесь. В современных версиях gcc, похоже, нет какого-либо флага компилятора или параметра CLI, который включал бы комментарии в стиле C ++ при использовании -ansi или -std = c89 .

Возможно, вы сможете получить то, что хотите, если подойдете к этому под другим углом. Вы можете скомпилировать с помощью -std = c99 и использовать флаги компилятора, чтобы отключить специфичные для C99 расширения, которые вам не нужны (не зная больше о том, зачем именно вам нужен ANSI соответствие, я не могу рекомендовать конкретные флаги).

0
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

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