2010-02-20 5 views
0

Я использую Visual Studio C++ 2008 Express Edition.VS C++ 2008: Изменение выходного текста?

Возможно ли изменить текст в области вывода для компиляции (или других) ошибок?

Например, я могу получить сообщение об ошибке: error C2556: int Класс :: getResult (void) + намного более относительный мусор.

Я могу разобрать выходной текст и легко найти и исправить свои ошибки. Было бы неплохо/полезно, если бы я мог изменить ошибки, чтобы сделать их чище, короче и дружелюбнее. Примером может быть сообщение об ошибке: «Source.cc (строка 10): отсутствует закрытие;»

+0

Это кажется невозможным, если вы сами не пишете компилятор. – Jichao

+1

jcyang - Я начинаю думать так же. Сообщения об ошибках, вероятно, устанавливаются программным обеспечением компилятора. – Azoreo

ответ

0

Это довольно легко сделать свой лучший снимок этой проблемы. Сам компилятор представляет собой программу с командной строкой с именем cl.exe. Если вы хотите отфильтровать свой вывод, вам нужно создать программу, которая также называется cl.exe. Он должен будет передать все аргументы командной строки до исходного cl.exe. Затем это займет то, что оригинал производит как сообщения на его стандартном выходе, проанализирует их, заменит их на нужные вам сообщения и распечатает их на свой собственный стандартный вывод.

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

+0

Хорошо, что дает мне возможность подумать об этом. Прямо сейчас я немного оттуда; по крайней мере, моя идея больше не цитирует Симпсонов, «возможно». Спасибо, Джерри. – Azoreo

3

Есть несколько вещей, которые вам нужно понять. Компилятор действительно делает все возможное; он сообщает вам, где именно это произошло, и весь сборник до этой точки. Он не знает, что вы намеревались написать, он знает, что вы написали, так как, возможно, можно предположить, что ошибка была вызвана чем-то еще более удаленным? Я думаю, что если бы вы писали его и доходили до того, что делали ошибки «чище, короче и дружелюбнее», вы бы поняли, что это намного сложнее, чем могло бы показаться.

Бывают ситуации, когда он может это сделать, и компиляторы становятся лучше предлагать им это похоже. Например это:

if (x); 
{ 
    x = 5; 
} 

Выдает предупреждение:

warning C4390: ';' : empty controlled statement found; is this the intent?

Но они не всегда могут сделать это.

Что все сказано, сообщения об ошибках действительно все, что вам нужно для решения проблемы, как только вы немного изучите язык и понимаете, что все это значит. Я думаю, что это огромный миф и преувеличение, что ошибки шаблона являются «злыми и загадочными». Хотя они могут быть многословными, они действительно не так уж трудно понять. Я не думаю, что ошибки шаблона являются загадочными, я думаю, что читатель не знает, как его хорошо читать, что делает его загадочным. Но если вы не торопитесь, вы увидите, что именно он пытался сделать, и где это не удалось.

В следующем стандарте C++ 0x появилась вещь под названием «понятия», которая бы устранила это. Они были похожи на теги, которые могли бы вписаться в классы, если бы они поддерживали все те теги, которые сказали им. Итак, в std::copy вместо ошибок о том, что вы не можете вызвать operator= на что-то, наряду с ошибками, которые распространяются, вы просто получите что-то вроде «Ошибка: Тип не CopyAssignable», и это было бы так. Такая же ошибка, различная презентация. И это также причина, по которой они были вырезаны, пока. они оказались неприятностями, и поскольку в любом случае это был синтаксический сахар, более важно работать над другими вещами. Надеюсь, мы увидим их когда-нибудь.

Теперь есть инструмент под названием STLFilt, который будет фильтровать ошибки шаблона относительно вещей в STL. Я никогда не использовал его, но я слышал, что он рекомендовал не раз. Вот один из их sample filters. Вы можете попробовать.


Поскольку вы, кажется, думаете, что это можно сделать на самом языке: nope. Язык не имеет представления о том, какие сообщения об ошибках должны выглядеть или что следует предупреждать или что не должно.

Вы найдете то, что я имею в виду в стандарте в разделе 1.4/2. Подводя итог, в основном говорится: «Если есть ошибка, выведите что-нибудь об этом». Вот и все.

+0

Gman, как сказано в исходном посте, я уже могу достаточно легко разобрать вывод и исправлять ошибки достаточно легко. Что я хочу знать, так это или нет * можно изменить выходной текст на нечто более дружелюбное *. Где-то в C++ - и, возможно, это определено в самом компиляторе, когда генерируется ERROR X, он сопровождается текстом «ERROR X: вы сделали такую-то ошибку». Я хочу знать, могу ли я изменить текст, чтобы сказать «ERROR X: этот код ошибки = эта проблема, исправьте это по строке y». – Azoreo

+1

@Matt: Нет, вам нужно быть писателем-компилятором, и чертовски хорош в этом. Ваше упрощение вашей задачи; вам легко думать «очевидно, я должен пойти по этой линии, чтобы исправить это», но вы человек. * У компьютеров нет этой роскоши * с точки зрения определения вещей, и ваша задача, вероятно, будет очень сложной. – GManNickG

+0

Итак, сообщения об ошибках определяются любым сущностью, написанной компилятором? И.Е., их нельзя изменить? Отлично, отвечает на мой вопрос, хотя я бы хотел, чтобы это было иначе. – Azoreo

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