做了一個在MFC的工程中編譯C文件的實驗

主要是爲了驗證各種情況下,VC++6.0報錯的內容。

實驗背景見下圖:

(1)建立一個MFC AppWizard工程

(2)TstExtn.h中的內容

*.h中的內容

(3)TstExtn.c中的內容

*.c中的內容

(4)在一個CPP文件中調用C文件中的函數

在*.CPP文件中調用*.C中函數

(5)去掉TstExtn.c的預編譯頭

去掉C文件的預編譯頭

第一步是,不定義大寫BOOL的類型(注:MFC中將大寫BOOL定義爲int型)

因爲按照C語言的方式編譯,程序報錯方式如下,可以看出編譯器不認識extern "C"{}中的大寫BOOL。

C++編譯器不認識C中的大BOOL

在TstExtn.h中打開關於大BOOL的類型定義,即可通過。由於.cpp文件中include了TstExtn.h,如果此時將大BOOL的類型定義爲int之外的類型,如char。會引發MFC中大BOOL類型的混亂。所以這個實驗中將TstExtn.h和TstExtn.c中的大BOOL的類型定義爲int。

 

如果在TstExtn.h開頭多寫了#include "stdafx.h"(這是一個常見的解決VC中C++/C混編的方法),則會報如下錯誤:

Compiling...
TstExtn.c
d:/program files/microsoft visual studio/vc98/mfc/include/afx.h(15) :

                                                    fatal error C1189: #error :  MFC requires C++ compilation (use a .cpp suffix)
Error executing cl.exe.
Creating browse info file...
BSCMAKE: error BK1506 : cannot open file './Debug/TstExtn.sbr': No such file or directory
Error executing bscmake.exe.

證明在#include "stdafx.h"添加的同時,要將文件的後綴名改爲*.cpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章