模板而不是cpp预处理器,以避免链接

Templates instead of the cpp preprocessor to avoid linking?

本文关键字:链接 处理器 预处理 cpp      更新时间:2023-10-16

是否有可能使用c++模板来避免链接到包含最终不调用的函数的库?例如,使用如下代码:

template <typename T>
struct Foo {
  void bar() { zod(); }
};
int main(int argc, char *argv[])
{
  return 0;
}

GCC 4.5将拒绝它:错误:' zod '没有依赖于模板形参的实参,所以' zod '的声明必须可用注意:(如果你使用' -fpermissive ', g++将接受你的代码,但不建议使用未声明的名称)

这里的错误是强制性的吗?是否有任何方法使用模板来实现这一点;所以要避免使用CPP宏。

我想你混淆了链接zod()提供原型(即声明,例如通过包括头文件)。

许多实现将很高兴地编译和链接具有inline函数(或模板)的程序,这些函数调用没有定义的函数。因此,这工作得很好(至少与MSVC 10, GCC 4.3和GCC 4.5):

void zod(); // we need the declaration, but no definition
inline void bar() { zod(); }
int main(int argc, char *argv[])
{
    return 0;
}

我不确定标准是否要求这样做。当然,它也应该工作与模板,而不是inline,只要模板从未实例化。

正如错误所暗示的那样,如果zod()依赖于模板参数,那么SFINAE将把它呈现为不存在问题。

必须有zod的声明。对不起。

如果你可以控制zod,并且不介意给它添加一个虚拟参数,你可以这样做:

template <typename T, T dummy>
struct Foo {
  void bar() { zod(dummy()); }
};
int main(int argc, char *argv[])
{
  return 0;
}

但是…主要的电子战。

在示例中没有显示任何需要对代码进行专门化的内容。在这种情况下,只需声明函数inline

也许还有更多我没有看到的问题;如果有,请编辑问题并提供更详细的信息。