2010年9月17日金曜日

VC2005+tvmet で意味不明のエラー

tvmetっていう行列演算ライブラリがあるんだけど,こいつをvc2005で使おうとすると,次のエラーでコンパイルできない.

C:\cygwin\usr\local\tvmet-1.7.2\include\tvmet/Matrix.h(108) : error C2219: 構文エラー : 型修飾子は '*' の後にのみ指定できます。

問題が起こっている箇所は,例えば vector.h の99行目

const_pointer _tvmet_restrict m_data;

解決方法を模索して至った結論は,コンパイルオプションに次の定義を入れること.

-D_tvmet_restrict=

前出の const_pointerの定義の中で

typedef const _tvmet_restrict HOGE_TYPE * hoge;

というふうに定義されているらしく オプションなしでは _tvmet_restictがrestrictになって
そんな予約後はないよというエラーになるらしい.
最初からそう言ってくれよと言いたいところだがVCのエラーは「型修飾子は '*' の後にのみ指定できます。」なのだ.
MSのエラーメッセージの分かりやすさはMS-DOSの時から変わってないと感じる瞬間だった.

2010年9月16日木曜日

NTEmacs+vista compilation-modeで文字化けする場合の対策

12年前,会社の先輩にMeadowの存在を教えてもらってから,ずーっとEmacsを使い続けている.
今ではEmacsなしの仕事は考えられないのだ
Windows XPまでは Meadowにお世話になったが,Vistaを使うようになってからはMeadowが動かないのでやむなくNTEmacsへ切り替えた.

最近になってWindowsで動作する簡単なテストプログラムを開発するときに重いVisual Studioを起動するのがめんどくさくなって,NTEmacs+make+VCという組み合わせを使う機会が増えてきた.
そうしたら NTEmacsのcompilation-modeに表示されるVCコンパイラの吐き出す日本語のエラーメッセージが文字化けするではないか.
しばらくは我慢してcmd.exeを起動し,日本語のエラーメッセージを確認してたけど,ダラダラと長ーい行数のエラーが吐出されたときは全てが表示されず困ったことになった.
ググって調べたところ下記のコードを.emacs.elに書いて解決に至った.
参考にしたサイトは,間違ってとじてしまったので参照元は後ほど.
解決への重要なアドバイスを頂いた@osamuさんに感謝!

(setq compilation-read-command t)
(defun compile (command)
(interactive
(if (or compilation-read-command current-prefix-arg)
(list (read-from-minibuffer "Compile command : "
compile-command nil nil
'(compile-history . 1)))
(list compile-command)))
(setq compile-command command)
(save-some-buffers (not compilation-ask-about-save) nil)
(let ((coding-system-for-read 'sjis-dos) ;; この辺を適当なコード名にする
(coding-system-for-write 'sjis-dos))
(compile-internal compile-command "No more errors")))

(add-hook
'shell-mode-hook
'(lambda ()
(set-buffer-process-coding-system 'sjis 'sjis)))