2012-05-31 76 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