2012-05-31 235 views
0

在Visual Studio 2008中,使用C++,我嘗試使用http://msdn.microsoft.com/en-us/library/ms235636.aspx上的說明構建DLL,除了我命名擴展名爲「.c」的源文件,而不是建議的「.cpp」。C++代碼使用.cpp源代碼編譯,但不包含.c

如果擴展名爲.c,則編譯器將引發37個錯誤。通過擴展.cpp,DLL可以成功建立。

源文件擴展的區別是什麼?

這裏是全碼:

// MathFuncsDll.cpp 
// compile with: /EHsc /LD 

#include "MathFuncsDll.h" 

#include <stdexcept> 

using namespace std; 

namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) 
    { 
     return a + b; 
    } 

    double MyMathFuncs::Subtract(double a, double b) 
    { 
     return a - b; 
    } 

    double MyMathFuncs::Multiply(double a, double b) 
    { 
     return a * b; 
    } 

    double MyMathFuncs::Divide(double a, double b) 
    { 
     if (b == 0) 
     { 
      throw new invalid_argument("b cannot be zero!"); 
     } 

     return a/b; 
    } 
} 




// MathFuncsDll.h 

namespace MathFuncs 
{ 
    class MyMathFuncs 
    { 
    public: 
     // Returns a + b 
     static __declspec(dllexport) double Add(double a, double b); 

     // Returns a - b 
     static __declspec(dllexport) double Subtract(double a, double b); 

     // Returns a * b 
     static __declspec(dllexport) double Multiply(double a, double b); 

     // Returns a/b 
     // Throws DivideByZeroException if b is 0 
     static __declspec(dllexport) double Divide(double a, double b); 
    }; 
} 

回答

3

編譯器(驅動程序)根據擴展名猜測源語言,假設C爲.c,C++爲.cpp。您可以使用-Tp來強制推測該猜測,以強制C++或-Tc強制C.如果您希望對所有通過的文件(而不是一個)進行大寫,請使用大寫(-TP-TC)。

+2

他正在使用visual studio。右鍵單擊解決方案資源管理器中的文件 - >屬性 - >配置屬性 - > C/C++ - >高級 - >編譯爲。 –

3

可能的編譯器解釋該文件作爲C文件,而不是一個C++一個。

8

當擴展名爲.c時,編譯器將其編譯爲C.當它是.cpp時,它將其編譯爲C++。

+0

這在該文件的設置中可覆蓋。 –

+0

@MooingDuck:......或帶有選項,正如Jerry Coffin指出的那樣。但我只是在解釋問題所在。 – Ryan