模板而不是cpp预处理器,以避免链接
Templates instead of the cpp preprocessor to avoid linking?
是否有可能使用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
。
也许还有更多我没有看到的问题;如果有,请编辑问题并提供更详细的信息。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 使用 g++ 预处理器进行替换会导致链接错误
- 带有预处理器的可视化C++条件链接
- 链接错误:在 32 位 arm 处理器上的 Ubuntu 12.04 上"Cannot find -ltinfo"
- 如何指定Xcode链接器的库和Xcode编译器的预处理器指令
- g++ 中链接的预处理器程序类似于 gcc 中的 cpp 程序
- 预处理器、汇编程序和链接器是编译器的一部分吗
- Qt -用预处理器指令检查链接的.lib在windows上的可用性
- 模板而不是cpp预处理器,以避免链接