先日, とあるプロジェクトをコンパイルする必要がありました. 手に入れたファイルは VC 用のようです. Express Edition を入手し nmake をかけてみると…
〜前略〜 hoge.c hoge.c(100) : error C2143: 構文エラー : ';' が '型' の前にありません hoge.c(110) : error C2065: 'n' : 定義されていない識別子です. hoge.c(120) : error C2065: 'n' : 定義されていない識別子です. hoge.c(130) : error C2065: 'n' : 定義されていない識別子です. 〜後略〜 |
いろいろ悩んだ結果, 以下のことがわかりました.
list1 | list2 |
int main(){   int n=3;   printf("abc");   printf("d%d",n);   return 0; } |
int main(){   printf("abc");   int n=3;   printf("d%d",n);   return 0; } |
> cl.exe list1.cpp |
> cl.exe list1.c |
拡張子をすべて cpp に変更し Makefile を適当に返るとか, 古い c の文法に則った書式に書き換えるとかするのが王道でしょうが, 量が多いとか, あまり大々的な変更を加えたくはありません. というわけでいろいろ調べた結果, c++ 風にコンパイルしろという /Tp オプション を見つけました.
> cl.exe /Tp list2.c |
で, この知見を Makefile に反映させようと思ったのですが, nmake の書式は普通の make と若干違います. どこでコンパイルさせているのかも分かりません. で, いろいろ調べた結果, Makefile の適当な所に
.c.obj: $(CC) $(CFLAGS) $(COPT) /Tp $< |
ただしこの手法は, 「拡張子が C だろうと C++ だと思ってコンパイルしろ」というオプションですので, 凝ったことしているとリンクとかうまくいかないかもしれません.