代码之家  ›  专栏  ›  技术社区  ›  Manex

在cpp项目内部编译的c模块中无法识别内联关键字(VS2005)

  •  2
  • Manex  · 技术社区  · 12 年前

    我正在C90兼容的编译器中开发一个嵌入式C应用程序,另一方面,为了测试和调试目的,该编译器部署在Matlab/Simulink中,将应用程序与CPP文件连接。这个包是用Matlab MEX编译的,它被配置为使用Visual Studio 2005来构建。

    这意味着我们有一个CPP文件和两个完全构建的.C/.H文件。使用 #ifdef __cplusplus extern "C" {...} 每个C调用上的技巧。

    然而,当嵌入式应用程序中的时间限制导致需要内联函数时,我遇到了一个问题。

    接下来,SSCCE内置于VS2005:

    主.cpp

    #include "c_method.h"
    
    void main()
    {
        for(int b = 0; b < 9; b++)
        int a = c_method(b);
    }
    

    c方法.c

    #include "c_method.h"
    
    inline int inline_fun(int x)
    {
        return x+1;
    }
    
    int c_method(int b)
    {
        return inline_fun(b);
    }
    

    c方法.h

    #ifndef __C_METHOD_H__
    #define __C_METHOD_H__
    
    int c_method(int b);
    
    #endif
    

    它提供以下错误:

    c_method.c(7) : error C2054: expected '(' to follow 'inline'
    c_method.c(8) : error C2085: 'inline_fun' : not in formal parameter list
    c_method.c(8) : error C2143: syntax error : missing ';' before '{' 
    

    我注意到我错过了 extern "C" {...} 但也不起作用。

    如SO中所述,更改 c_method.c c_method.cpp 会成功的, 然而 我宁愿有一个替代的解决方案,如果有的话,因为我对嵌入式C编译器接受cpp扩展而不向我抱怨不是很有信心。。。

    非常感谢。

    补充

    @±áá得到了答案。创建内联的空声明就可以了。

    然而,正如@Lundin所建议的,我将考虑在PC平台构建中使用另一个C编译器的可能性。

    3 回复  |  直到 12 年前
        1
  •  5
  •   Angew is no longer proud of SO    12 年前

    Visual studio不支持 inline 关键字,因为它没有实现C99(它引入了该关键字)。

    但是,它确实支持特定于Microsoft的关键字 __inline 在C和C++中。要使代码可移植,可以执行以下操作:

    #include "c_method.h"
    
    #ifdef _MSC_VER
      #define inline __inline
    #endif
    
    inline int inline_fun(int x)
    {
        return x+1;
    }
    
    int c_method(int b)
    {
        return inline_fun(b);
    }
    

    当然,在实践中 内联 定义转换为共享头文件。

        2
  •  1
  •   Lundin    12 年前

    C90中没有内联关键字,所以这就是它无法工作的原因。C编译器似乎不太可能编译C++。Visual Studio之所以这样做,只是因为它是C++编译器,而不是C编译器。

    您必须检查嵌入式编译器是否有该语言的编译器扩展。通常有一个编译器选项可以启用。

        3
  •  0
  •   hkuwenchao    12 年前

    我认为在VisualStudio中,内联函数不能在.c或.cpp文件中定义。您可以尝试将内联函数的定义移动到头文件中。