【问题标题】:C execute function from different files with the same nameC从具有相同名称的不同文件中执行函数
【发布时间】:2017-09-29 10:32:51
【问题描述】:

我有 3 个具有相同“decideAction(game)”功能的 AI 文件

在运行游戏的主文件中:

在 C++ 中这很简单,因为我只使用了命名空间

namespace AI_A {
    #include "AI_A.cpp"
}
namespace AI_B {
    #include "AI_B.cpp"
}
namespace AI_C {
    #include "AI_C.cpp"
}

在游戏中我做到了

if(turn == 0) { AI_A:decideAction(game); } etc....

有没有办法让我为 C 做到这一点?因为 C 没有命名空间或类?

每个 AI 文件本身都有很多函数和一个decisionAction 函数,所以我不能只#include 所有AI 文件并重命名decisionAction,因为2 个不同的AI 文件可能具有相同的函数名称/全局变量。

谢谢!

【问题讨论】:

  • 包含实现 (.cpp) 文件是一个非常糟糕的主意。你永远不应该包含定义(在 C++ 中它有点复杂)。命名空间应该在头文件中。并且 C 很好地具有名称空间,只是没有用户定义的名称空间。它们是不同的语言。 Siad 认为:重新考虑项目结构,因为它看起来很混乱。
  • 一种选择是使用函数指针表。
  • @kaylum - 我认为所有函数的签名都必须不同才能使用函数指针表。在所述问题中,所有函数签名都是相同的,但在不同的文件中。这还有可能吗?谢谢。
  • @Nguaial “我认为所有函数的签名必须不同才能使用函数指针表”。不知道你从哪里得到这个想法。
  • @Nguaial 啊,这是一个不同的问题。当然有办法做到这一点,但哪种方式最好/合适取决于 OP 的全部要求。一种方法是让每个实现都有一个用于初始化或返回函数表的 API。然后,主代码将为每个实现调用该 API 以获取其函数表。这是常用的基本插件模型。

标签: c


【解决方案1】:

你不能在 C 中包含这样的文件。在 C 中,“#include”表示简单的文件插入,并且是在预处理器级别完成的(就像所有以 # 开头的东西),所以它显然不能依赖于任何运行时(像转弯值)

不过,这没什么大不了的,因为您仍然可以通过多种方式同时使用所有 3 个文件中的函数。大多数系统的工作方式是在名称中添加预处理器机制来操作它们。 阅读:Why doesn't ANSI C have namespaces?

我在预处理器级别看到的快速修复是简单地使用预处理器来欺骗名称,这就像一个简单的查找和替换:

#include "AI_A.cpp"
#define decideAction AI_AdecideAction
...
#include "AI_B.cpp"
#define decideAction AI_BdecideAction

另外,不要忘记标题(如果有的话)并注意所有冲突,它会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多