如何避免“unreferenced function with internal linkage has been removed”警告?
嘿,这个警告我之前写代码的时候也踩过坑!先给你拆解下为什么会出现这个问题:你在头文件里用static声明了函数,每个包含这个头文件的编译单元(比如你的main.cpp)都会生成一份这个函数的独立副本。如果某个编译单元里完全没调用这些函数,编译器就会提醒你——“这个内部链接的函数我没用上,已经把它移除啦”。
针对你的代码场景,给你几个实用的解决办法:
把内部函数移到.cpp实现文件里
如果你这些函数不需要在多个编译单元里使用,直接把static void foo1()这类函数的定义从头文件移到对应的.cpp文件里。这样只有这个.cpp编译单元能看到它,其他单元不会生成无用的副本,自然就不会触发警告了。毕竟static本来就是用来限定仅当前编译单元可见的,放.cpp里才是它的常规用法。用
inline替代static(符合场景时优先选这个)
C++里的inline函数允许在多个编译单元里存在定义(只要所有定义的内容完全一致),而且编译器会智能处理:如果某个编译单元没用到这个inline函数,它大概率不会生成该函数的副本,也就不会弹出这个警告。
针对你代码里的情况,可以把static void foo1()改成inline void foo1(),static inline void foo2()直接去掉static变成inline void foo2()就行——因为inline已经帮你处理了跨编译单元的链接问题,没必要再加static画蛇添足。临时禁用特定警告(下策,谨慎使用)
如果你实在想保留static的写法,又不想看到这个警告,可以给编译器加参数关闭它。比如GCC或Clang用-Wno-unused-function,MSVC用/wd4505。不过我不太推荐这个方法,因为它会把所有“未使用函数”的警告都关掉,可能会掩盖其他真正需要你注意的问题。
备注:内容来源于stack exchange,提问作者bers

