小编Kir*_*riy的帖子

最新 gcc 的未定义参考问题

尝试使用 gcc 12.1.0 编译以下代码时出现链接时错误。使用 clang、msvc 和较旧的 gcc,它可以按预期进行编译。

template<typename T>
void def()
{}

template<void (*foobar)() = def<int>>
void bar()
{
    foobar();
}

template<typename T>
void foo()
{
    bar();
}

int main()
{
    foo<int>();
}
Run Code Online (Sandbox Code Playgroud)
Error: /usr/bin/ld: /tmp/cchkaKVw.o: in function `void bar<&(void def<int>())>()':
> main.cpp:(.text._Z3barIXadL_Z3defIiEvvEEEvv[_Z3barIXadL_Z3defIiEvvEEEvv]+0x5): undefined reference to `void def<int>()'
Run Code Online (Sandbox Code Playgroud)

这是 gcc 回归还是这段代码有问题?

c++ gcc templates compiler-errors linkage

11
推荐指数
1
解决办法
1524
查看次数

宏扩展忽略了 MSVC 中的一些标记

我在 msvc 编译器中遇到宏扩展问题。我希望以下代码能够扩展为F x,它在 gcc 和 clang 上执行此操作。但 msvc 将其扩展为仅F忽略x令牌。这里发生了什么?

#define S(s) s
#define F()

#define M() S(S(F) x)

M() // expands to 'F' on msvc
Run Code Online (Sandbox Code Playgroud)

但是,如果没有定义,F()它也会像预期的那样扩展到F xmsvc 上。

#define S(s) s
// #define F()

#define M() S(S(F) x)

M() // expands to 'F x' on msvc
Run Code Online (Sandbox Code Playgroud)

我正在使用编译器资源管理器站点来检查此代码。编译器版本是x64 msvc v19.latest。

c++ macros visual-c++

3
推荐指数
1
解决办法
259
查看次数

标签 统计

c++ ×2

compiler-errors ×1

gcc ×1

linkage ×1

macros ×1

templates ×1

visual-c++ ×1