5

我想做的事:

我已经自动生成了使用 Matlab Simulink 生成的 C 代码,并希望通过用 C++ 编写的更多功能来增强它。准确地说,C 代码调用内部使用 C++ 的 C 风格 API。整个事情都在一个 VS 2008 C++ 项目中。

问题:

只要我告诉 VS 将其编译为 C 并省略我的 C++ 代码,它就会编译。一旦我编译它,就会出现 C++ 问题。

首先,我不能将它编译为 C++,因为 math.h 由于对重载函数 (fabs()) 的不明确调用而产生错误 C2668。

如果我现在另外添加一些 C++,例如包含 iostream,我会收到数百个编译器错误,抱怨 cstdlib 中某处缺少花括号和冒号。

我的问题:

我怎样才能以一种有效的方式混合这两种语言?我阅读了预处理器定义(http://www.parashift.com/c++-faq-lite/overview-mixing-langs.html),但我不知道如何正确应用它们来解决我的问题。

任何帮助是极大的赞赏!

4

2 回答 2

6

您似乎在 C 源代码中包含 C++ 标头。可能间接地通过将它包含在其他头文件中(即 C 源代码包含您的 C++ 头文件,而 C++ 头文件包含其他 C++ 头文件)。

有两种方法可以解决这个问题:

  1. 仅当在 C++ 中编译时,才使用预处理器有条件地包含 C++ 头文件。这可以像

    #ifdef __cplusplus
    # include some_cpp_header
    #endif
    
  2. 不要在头文件中包含 C++ 头文件(直接或间接)。或者更好的是,制作一个单独的头文件,其唯一目的是包含在 C 源代码中,并且只包含extern "C"API 的函数原型(编译为 C++ 时)。头文件的主体可能如下所示

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void function1(int);
    int function2(const char*);
    /* More function prototypes */
    
    #ifdef __cplusplus
    }
    #endif
    

我推荐第二种方法。

于 2013-10-18T12:58:13.497 回答
1

包含该<iostream>库,然后您必须使用 -compiler 编译您的代码。

于 2013-10-18T12:57:57.803 回答