相关疑难解决方法(0)

外部内联

我理解"内联"本身就是对编译器的建议,并且在它的结构中它可能会或可能不会内联函数,它也会产生可链接的目标代码.

我认为"静态内联"执行相同的操作(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它).

"extern inline"在哪里适合图片?

假设我想用内联函数替换预处理器宏,并要求此函数被内联(例如,因为它使用__FILE__和__LINE__宏,这些宏应该为调用者而不是这个调用函数解析).也就是说,如果函数没有内联,我想看到编译器或链接器错误."extern inline"这样做吗?(我假设,如果没有,除了坚持使用宏之外,没有办法实现这种行为.)

C++和C之间是否存在差异?

不同编译器供应商和版本之间是否存在差异?

c c++ extern inline-functions

86
推荐指数
3
解决办法
4万
查看次数

带有默认函数的 Windows 静态库

我想在 Windows 中创建一个静态库 (.lib),可以在后续构建中用作未定义函数的“备份”。

例如,假设我有 foobar.lib,它具有以下定义:

FOO
BAR
Run Code Online (Sandbox Code Playgroud)

我还有一些其他程序,FOO它只定义并且将被构建到一个必须导出的 DLLFOOBAR. 我希望能够使用 foobar.lib 自动导出BAR生成的 DLL 中的默认定义(并忽略FOOfoob​​ar.lib 中的定义)。

我曾尝试将 foobar.lib 发送到链接器,但出现多个定义的符号错误(/FORCE 应该覆盖它,但强烈警告它可能无法按预期工作)。我也试过使用 /NODEFAULTLIB:foobar.lib 但它完全忽略了库并说BAR是未定义的。

我几乎 100% 肯定有一种方法可以做到这一点,因为我使用一个执行此操作的应用程序 (Abaqus) 来允许用户编写插件,而不必为插件 DLL 定义所有必需的导出。他们不使用 /FORCE 选项。

windows linker static-libraries

5
推荐指数
1
解决办法
1169
查看次数

MSVC 链接器等效于 --wrap

背景:我在 msvc9 上处理一些遗留系统,浮点到 int 转换存在问题。__ftol2_sse如果不为 SSE 编译,它会发出一条指令,该指令是未定义的引用。

抑制这种情况的唯一方法是使用/QIfist执行内联转换的选项,而不调用任何ftol(). 但是,这些内联转换具有不同的舍入算法,因此在与现有代码一起使用时会导致问题。那,他们向 cl.exe stderr 发出不可抑制的“已弃用”警告。

我的解决方法是:

// Declare a regular _ftol() function that is present.
long __cdecl _ftol(double); 
// Define _ftol2_sse() to be the regular one.
long __cdecl _ftol2_sse(double f) { return _ftol(f); }
Run Code Online (Sandbox Code Playgroud)

这很好用。但是,某些构建确实已_ftol2_sse定义,在这种情况下,我会得到多个定义,并且很难在代码中弄清楚这一点。


我希望做类似--wrap __ftol2_ssefrom 的事情ld,并覆盖所有构建的行为。在 MSVC 上有这样的可能吗?

c ld visual-c++-2008 visual-c++

5
推荐指数
0
解决办法
989
查看次数

模板专业化,windows vs gcc上的不同行为?

我正在寻找GCC与MSVC不同的概述或描述,用于编译+链接具有特化的模板类.例如,这种类型的东西适用于GCC但不适用于MSVC:

// Base.h
template <typename T> struct Base {
    template <class G>  QString  makeTitle(const G* obj){obj->CompilerError();}
    };

// in Foo.cpp
template <> template <class G> QString Base<T_1>::makeTitle(const G* obj) {  return mystr(); }
void SomeFunc() {
  std::cout<<  Base<T_1>().makeTitle<myclass>() ;
}
Run Code Online (Sandbox Code Playgroud)

并且解决方案往往是我必须在使用之前在Base.h中声明特化,或者在Windows上存在链接错误.MSVC如何/为什么隐式地实例化,以及GCC如何/为什么对某些cpp文件中声明的特化是健壮的?

相关问题,注意一般'使用前声明'要求: 模板专业化 - MSVC和GCC/MinGW之间的不同行为

c++ linker gcc templates

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