我最近切换到Visual Studio 2010,而Intellisense在使用boost库时不需要花半分钟时间显示,Microsoft的建议似乎使用了预编译的头文件.
除了我之前从未使用过它们(除非被Ugly ATL Wizards(TM)强迫),所以我四处寻找它们是如何工作的.
基本上,大集中stdafx.h方法似乎是完全错误的.我从不想在所有来源中包含(甚至便宜)一大堆头文件.由于我不使用Windows库(我使用C++/CLI更高级别的包装器,然后使用.NET与外界交谈),我没有"一整套不变的巨大标头".正好boost和标准的库标题分散在各处.
有一个有趣的方法解决这个问题,但我无法弄清楚如何使这项工作.似乎每个源文件必须编译两次(如果我错了,请纠正我):一次使用/ Yc,一次使用/ Yu.这增加了开发人员的负担,必须手动调整构建系统.
我希望找到一些"为每个源文件自动生成一个预编译的头文件"技巧,或者至少是一些"最佳实践",但大多数人似乎都乐于将这个世界纳入其中stdafx.h.
我可以在每个源文件的基础上使用预编译头文件有哪些选项?我并不真正关心构建时间(只要它们不会飙升),我只想让intellisense 快速工作.
通过尝试解决这个问题,有些事让我感到奇怪.请考虑以下代码:
template <typename T>
struct foo
{
foo(T const& x) : data(x) {}
T data;
};
Run Code Online (Sandbox Code Playgroud)
似乎我可以构造一个foo<T const&>没有错误的类型的对象,假设T const& const&被理解为T const&.
这似乎也被称为参考崩溃,但我之前从未听过这个术语(参见链接问题中的评论).
这是普遍的吗?这是标准吗?
只是一个简单的问题,我找不到一个好的参考,特别是关于未来C++ 0x标准的当前实现.
由于移动构造函数可以抛出,这意味着某些标准库函数无法提供强大的异常保证(例如vector<T>::resize()).
有一个建议1)使所有标准库移动构造函数"不抛出",2)在用户代码上添加编译时检查以确保例如.std::pair<std::string, MyType>定义一个nothrow移动构造函数或根本没有移动构造函数.
这个提案怎么了(特别是关于这个问题)?问题如何在最终草案中"解决"?
最重要的是,当我使用最近的GCC或MSVC 10时,它对我意味着什么?标准库的那些实现是否提供了例如的强例外保证.std::vector<MyTypeWithAThrowingMoveConstructor>::resize()?
编辑:我没有看到这个明显相关的问题.如果对我的问题是重复的事实达成共识,那就关闭它.但是,我对实施的内容非常感兴趣,而不是讨论的内容.
机器epsilon被规范地定义为添加到一个的最小数字,给出不同于一个的结果.
有一个Double.Epsilon但名称非常具有误导性:它是可表示的最小(非规范化)Double值,因此对任何类型的数字编程都是无用的.
我想获得该类型的真正 epsilon Double,以便不必将容差硬编码到我的程序中.我该怎么做呢 ?
为何选择STL
std::iterator_traits<const T*>::value_type
Run Code Online (Sandbox Code Playgroud)
与...的类型相同
std::iterator_traits<T*>::value_type
Run Code Online (Sandbox Code Playgroud)
为什么它的设计是这样的?首先不应该是const T而第二个是T吗?你应该如何采用底层const正确类型的迭代器?我知道你可以编写自己的模板类和专业化并从中获取
std::iterator_traits<const T*>::pointer
Run Code Online (Sandbox Code Playgroud)
但不应该有一个成员typedef持有它吗?
考虑:
struct A { int x;};
struct B : A {};
struct C : private A {};
Run Code Online (Sandbox Code Playgroud)
现在,正如预期的那样,代码
struct D : C
{
D () { C::x = 2; }
};
int main () { D d; }
Run Code Online (Sandbox Code Playgroud)
不编译:
test2.cc: In constructor ‘D::D()’:
test2.cc:1:16: error: ‘int A::x’ is inaccessible
test2.cc:7:12: error: within this context
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做
struct D : B, C
{
D () { C::x = 2; }
};
int main () { D d; }
Run Code Online (Sandbox Code Playgroud)
然后错误就消失了!是不是也不A::x应该无法访问?这里有什么解释?
我正在使用 …
是
std::vector<double> foo ()
{
std::vector<double> t;
...
return t;
}
Run Code Online (Sandbox Code Playgroud)
和
std::vector<double> foo ()
{
std::vector<double> t;
...
return std::move (t);
}
Run Code Online (Sandbox Code Playgroud)
相当于?
更确切地说,return x总是相当于return std::move (x)?
我有一个用C++编写的共享库.它导出一个可见的界面,extern "C"该界面由创建,破坏和操纵不透明类型的函数组成.
现在,我想要一个使用这个库的纯C程序.
我可以这样做(平台独立)吗?如果main没有用C++编写,C++ 运行时和C++静态对象什么时候会被初始化?
我做C#excel互操作.我从C#调用宏,我期待对象的数组.我能够从返回二维数组的宏中获取二维对象数组.
但是,其他(第三方)宏应该返回一维数组.我无法得到(object[])xlApp.Run(...)工作(它抛出一个异常),调试器中的类型信息表示结果是类型Object[*].来自异常的实际消息是
Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.
Run Code Online (Sandbox Code Playgroud)
这是什么Object[*]类型,如何从中检索一维数组?
编辑:我想到这可能意味着SAFEARRAY的VARIANTS.但随后出现了两个问题:为什么二维数组一切正常?如何将SAFEARRAY转换为C#数组?
考虑到分散在整个互联网上的有关该主题的系统性过时内容,这似乎真的太多了.
我根本无法找到可用的Scheme实现的无噪声和最新列表(除了那里,但我已经享受了一个丰富的功能总结表)所以我问社区而不是尝试几十种语言的实现我还没掌握.帮助我享受这种神奇的语言.
要求:
我现在正在使用Ypsilon,我发现它很棒,但自2008年以来一直没有维护.Guile可以成为一个很好的竞争者,但它看起来相当沉重(和Ypsilon相比,FFI更容易).
我可能缺少一些高质量的实现,所以请随意分享您的经验.
更新感谢您的回答,我会选择Larceny,因为它提供了我正在寻找的所有内容.祝大家快乐诡计多端!
c++ ×7
c# ×2
.net ×1
c ×1
c++11 ×1
com-interop ×1
exception ×1
iterator ×1
portability ×1
scheme ×1
visual-c++ ×1