【问题标题】:C++ function in C give a Warning : Implicit declaration of FunctionC 中的 C++ 函数给出警告:函数的隐式声明
【发布时间】:2014-04-30 11:03:42
【问题描述】:

我正在使用 allegro 编写 C 应用程序,我需要一些 C++ 功能 所以我使用 extern "C" 为我的函数编写了一个 C/C++ 接口 但它给了我很多关于这些函数的隐式声明的警告

这是我在 lists.h 中的代码

#ifndef LISTS_HPP_INCLUDED
#define LISTS_HPP_INCLUDED

#include "entities.h"
#include "engine.h"

#ifdef __cplusplus

extern "C"
{
    int cloneList_size(void);
    int colList_size(void);
    int scene_size(void);

    void cloneList_clear(void);
    void colList_clear(void);
    void scene_clear(void);

    void push_back_cloneList(Object *object);
    void push_back_colList(t_collision *col);
    void push_back_scene(Object *object);

    void remove_cloneList(Object *object);
    void remove_scene(Object *object);

    Object* Scene(int nbr);
    Object* CloneList(int nbr);
    t_collision* ColList(int nbr);
}
#endif // __cplusplus

#endif // LISTS_HPP_INCLUDED

这是我在 lists.cpp 中的代码

#include "lists.h"

#include <iostream>
#include <vector>
#include <stdexcept>


std::vector<Object *> scene;
std::vector<t_collision *> colList;
std::vector<Object *> cloneList;

int cloneList_size(void)
{ //..
}
//And all other functions here

我的 main.c 中不能包含 lists.h 或者我有一个错误,因为 C 编译器无法识别 extern "C" 部分

如果我不包含lists.h,它可以工作,但有许多函数警告的隐式声明..

我使用的是 Codeblocks 13.12,但当我在谷歌上搜索我的问题时,我不知道如何启用另一个论坛中有人建议的 C++ 编译选项。

我做错了什么,我应该怎么做才能纠正这些警告..

【问题讨论】:

  • extern "C" 在哪里?编译器的错误和警告信息是什么?
  • extern "C" 仅与 C++ 相关 - C 不需要它。您需要保护源文件顶部和底部的#ifdef __cplusplus 中的外部“c”。
  • 我已经完成了......现在我可以包含我的头文件,但我仍然有警告
  • 然后我们需要查看您的 C 源代码。除非您在使用定义后包含该文件,否则您应该不会遇到此问题。

标签: c++ c interface compiler-warnings extern


【解决方案1】:

这不是你做#ifdef __cplusplus/extern "C" 的方式。它应该看起来像这样:

#ifdef __cplusplus
extern "C" {
#endif

int cloneList_size(void);
...
t_collision* ColList(int nbr);

#ifdef __cplusplus
}
#endif

在您的版本中,C 编译器看不到任何函数声明,因为您忘记在它们周围添加另一个 #endif 和另一个 #ifdef __cplusplus。对于 C 编译器 __cplusplus 未定义。但它仍然需要查看函数声明——只是没有 extern "C" 围绕它们的块。

【讨论】:

    【解决方案2】:

    替换

    int cloneList_size();
    

    int cloneList_size(void);
    

    在 C++ 中,函数声明中的 () 或 (void) 表示“无参数”。 在 C 中, (void) 表示“无参数”,而 () 表示“一些未知但固定数量的参数”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多