如何声明和调用具有未知参数的函数?

时间:2016-12-29 19:41:19

标签: c++ function c++11 extern

假设我有一个函数drawImage,它需要很多参数,其中一些是WinApi类型,如HWNDHDC等等;而且我不想在我的班级标题中导入所有这些内容。但是我需要从我的班级方法中调用它。

extern void drawImage();

class A {
private :
    int n;
    // ...
public :
    // ...
    void draw() {
        drawImage(n);
    }
};

上面的代码给出了预期的错误:drawImage does not take one argument。那么我怎么能实现这个目标呢?

此外,我不想在包含WinApi内容的源文件中定义我的成员函数。

更新

extern void drawImage();
extern int a;
extern unsigned long int b;
...
extern "C" void c;
class A{
       private :
         int n;
        ...
      public :
       ...
       void draw(a,b,c){
        drawImage(a,b,c,n);
       }
}

这可以成为一个很好的解决方案,但Visual Studio不允许extern void声明。

1 个答案:

答案 0 :(得分:2)

只需在.cpp文件中定义void A::draw()不在线(例如A.cpp)。
在那里,您可以包含完整的drawImage声明,并从A.h中删除该声明。

如果这还不够,也就是说,您希望将WinApi内容与代码完全分开,则只需更进一步。您的A.cpp看起来像是:

#include "A.h"

namespace winapi {
    // Wrapper function for WinApi's drawImage,
    // with the parameters we actually care about
    void apiDrawImage(int, unsigned long, int);
}

void A::draw(int a, unsigned long b) {
    apiDrawImage(a,b,n);
}

然后您在另一个.cpp文件中实施winapi::drawImage,比如winapi.cpp

// Declares the actual drawImage() function
#include <WinApiStuff.h>

namespace winapi {
    void apiDrawImage(int a, unsigned long b, int n) {
        // Forward to WinApi
        ::drawImage(/* ... */);
    }
}

然后winapi.cpp将是唯一了解WinApi的文件。

奖励点:如果您编译并链接启用LTO(-flto用于GCC和Clang),所有这些都可以跨翻译单元内联,最终绝对没有开销!