C++ 代码使用 .cpp 源而不是 .c 编译

Posted

技术标签:

【中文标题】C++ 代码使用 .cpp 源而不是 .c 编译【英文标题】:C++ Code Compiles with .cpp Source but not .c 【发布时间】:2012-05-31 23:28:14 【问题描述】:

在 Visual Studio 2008 中,使用 C++,我尝试使用 http://msdn.microsoft.com/en-us/library/ms235636.aspx 处的说明构建 DLL,但我将源文件命名为扩展名为“.c”而不是建议的“.cpp”。

如果扩展名为 .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);
    ;

【问题讨论】:

【参考方案1】:

当扩展名是.c时,编译器将其编译为C。当它是.cpp时,将其编译为C++。

【讨论】:

这在该文件的设置中是可覆盖的。 @MooingDuck:...或者有选项,正如 Jerry Coffin 指出的那样。但我只是在解释问题所在。【参考方案2】:

编译器(驱动程序)根据扩展名猜测源语言,假设 C 代表 .c,C++ 代表 .cpp。您可以使用 -Tp 覆盖该猜测以强制 C++ 或 -Tc 强制 C。如果您希望传递的所有文件而不是一个文件,请大写(-TP-TC)。

【讨论】:

他正在使用视觉工作室。右键单击解决方案资源管理器中的文件->属性->配置属性->C/C++->高级->编译为。【参考方案3】:

可能编译器将文件解释为 C 文件,而不是 C++ 文件。

【讨论】:

以上是关于C++ 代码使用 .cpp 源而不是 .c 编译的主要内容,如果未能解决你的问题,请参考以下文章

c++代码反编译

怎么用Visual Studio 2008编写C++程序?

extern “C”的使用

objective-c和Cpp怎么混合编程?

使用makefile动态编译c++代码

是否有编译为机器代码的 C C++ C# 编译器 [关闭]