我可以在VS2008的C代码中使用C ++向量

时间:2011-09-29 17:07:50

标签: c++ c

我在vs2008中运行c代码。我很好奇,如果我可以将此代码与c ++代码混合

4 个答案:

答案 0 :(得分:4)

简短的回答是肯定的。但是,有一些细微差别。

C ++通常支持C的大部分子集。这意味着您几乎可以从C ++代码中获得C语言中的任何可用内容(例如函数,库等)。从这一点来看,你有两个选择,一个简单,一个更难。

选项#1 - 使用C ++编译器。

只需将您的代码视为C ++即可。简单地说 - 使用C ++编译器。

选项#2 - 混合C和C ++。

您可以编写C代码并使用C ++编译器进行编译。在需要使用C ++组件的地方使用类似C的C ++。例如,您可能具有类似于以下内容的设置:

  • head1.h - C函数的声明。例如:

    void foo1();

  • header2.h - 打算使用C ++代码的C函数的声明。

    #ifdef __cplusplus
    extern "C" {
    #endif
        void foo2 ();
    #ifdef __cplusplus
    }
    #endif
    

两个源文件,一个C和一个C ++:

  • source1.c

    #include "header1.h"
    #include "header2.h"
    
    void foo1 ()
    {
       foo2 (); /* Call a C function that uses C++ stuff */
    }
    
  • source2.cpp

    #include <vector>
    #include "header2.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void foo2 ()
    {
        std::vector<int> data;
        /// ... etc.
    }
    
    #ifdef __cplusplus
    }
    #endif
    

当然,您必须使用C ++编译器编译“cpp”文件(但您仍然可以使用C编译器编译“c”文件)并将程序与标准C ++运行时链接。

例如,Apple使用类似(但稍微复杂一些)的方法。他们混合使用C ++和Objective-C,调用混合的Objective-C ++。

<强>更新

如果您选择将C代码编译为C ++,我建议您花些时间研究C和C ++之间的差异。有些情况下,代码既可以是合法的C和C ++,但会产生不同的结果。例如:

extern int T;

int main()
{
    struct T { int a; int b; };
    return sizeof(T) + sizeof('T');
}

如果它是C程序,那么正确的答案是8.如果是C ++,答案是9.我已在我的博客文章here中详细解释了这一点。

希望它有所帮助。祝你好运!

答案 1 :(得分:1)

如果您使用C ++编译器编译代码作为C ++程序,那么您可以使用std::vector
如果您使用C编译器编译代码作为C程序,则不能。

这是因为std::vector是由C ++标准定义的类型,C标准没有将任何类型定义为std::vector

简单来说,C编译器不了解std::vector是什么。

答案 2 :(得分:1)

有一个开关将.c文件编译为C ++(/ TP)。如果启用此功能,则可以将c用作C ++。请注意,某些c代码不会在没有修改的情况下编译为C ++(主要与类型转换有关; c ++对此有更严格的规则)。

答案 3 :(得分:0)

如果您正在与一些现有的C库连接,那么您当然可以使用C ++。如果您正在编译为C,则无法使用任何C ++功能,例如std::vector