【问题标题】:Checking if a static function exists at compile time在编译时检查静态函数是否存在
【发布时间】:2020-05-17 04:12:25
【问题描述】:

function.c(我无法编辑此文件)

#define FOO    1

#if FOO == 1
    void Foo() {}
#endif

cpp

class MyClass
{
#if FOO == 1
    void CppFoo()
    {
        Foo();
    }
#endif
}

我想做同样的事情,但不使用 main.cpp 文件中的定义 TEST

我想做什么:

class MyClass
{
#if (extern "c" Foo() exist)
    void CppFoo()
    {
        Foo();
    }
#endif
}

如果尚未声明静态函数 Foo(),则无需声明 CppFoo() 方法。

我该怎么做?

【问题讨论】:

  • 请选择一种编程语言。
  • 你的意思是“编译时间”还是“链接时间”? “存在”是指“已定义”还是“已声明”?编译时可以检测到已声明但它无法洞察是否已定义,因为函数是否已定义取决于您传递给链接器的内容。
  • 你没有静态函数,你有一个带有外部链接的全局函数。由于 C++ 在翻译单元级别上运行,因此无法确定给定翻译单元之外的任何内容。你想要的都是不可能的。
  • 请注意,即使定义了函数,C++ 代码也不会工作,除非有声明 extern "C" void Foo();。请记住,在 C 中,void Foo();void Foo(void); 是不一样的!
  • @RaymondChen 我的意思是“声明”,我编辑了我的问题以使其更易于理解。

标签: c++ compile-time weak-linking


【解决方案1】:

可以使用弱属性,例如:

文件交流:

#include <stdio.h>

int foo() __attribute__ ((weak));
int foo() {}

int main(int argc, char** argv)
{
    foo();
}

文件 b.c:

#include <stdio.h>

int foo () {
    printf("Hello Wurld!\n");
}

现在如果不编译和链接 b.c,则调用默认(无操作)函数 foo(),否则调用 b.c 中的函数 foo()

【讨论】:

  • 抱歉,我修改了最初的问题以适合我的具体情况。
  • @Parmi93 假设“存在”意味着“定义”,上述解决方案仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2013-11-13
相关资源
最近更新 更多