有没有人成功构建了Cygwin版本的GHC(因为Haskell从使用Cygwin切换到MinGW)?
来自haskell网站:
"GHC的目标是MinGW,而不是Cygwin.原则上可以构建GHC的版本,GHC-cygwin,而不是针对Cygwin.GHC-cygwin的最重要的一点是GHC-cygwin编译的Haskell程序可以导入( Haskell)Posix库.我们不支持GHC-cygwin;它超出了我们的资源." https://ghc.haskell.org/trac/ghc/wiki/Building/Platforms/Windows
我尝试使用Cygwin的configure/gcc构建,但未成功.这失败是因为我无法让Windows版本的GHC使用Cygwin的gcc.这似乎是因为Windows的GHC版本被"注册"并且无法输出c代码.此外,不再支持这种"取消注册和移植"方法.
如果有人完成了这个(因为Haskell从使用Cygwin切换到MinGW),我真的很想知道.关于如何做到这一点的说明将是伟大的,但如果有人已经完成了这一点,简单的"是"将是非常宝贵的.
我最近的尝试是MinGW/MSys的交叉编译标志 --target=i386-unknown-cygwin32.这是结果错误:
HSC2HS libraries/haskeline/dist-install/build/System/Console/Haskeline/Backend/Win32.hs
libraries\haskeline\System\Console\Haskeline\Backend\Win32.hsc:169
directive let cannot be handled in cross-compilation mode
make[1]: *** [libraries/haskeline/dist-install/build/System/Console/Haskeline/Backend/Win32.hs] Error 1 make: ***
[all] Error 2
Run Code Online (Sandbox Code Playgroud)
由于程序需要链接,cygwin1.dll我不认为将目标设置为Linux体系结构会很有用.
这个问题与此后提出的问题密切相关.
Stroustrup 在这里描述了定义类内常量的方法.
当我按照Stroustrup的方法时,我看到了预期的结果.但是,在Visual Studio 2010中,调试器无法解析static const该类范围内的类成员.这就是我的意思:
#include <iostream>
class Foo {
public:
static const int A = 50;
char arr[A];
void showA();
};
void Foo::showA() {
std::cout << "showA = " << A << "\n";
}
int main() {
Foo f;
f.showA();
}
Run Code Online (Sandbox Code Playgroud)
当调试器在showA()中时,"监视"窗口报告:
Error: Symbol "Foo::A" not found
Run Code Online (Sandbox Code Playgroud)
我想强调该程序的行为符合预期,即输出为:
showA = 50
Run Code Online (Sandbox Code Playgroud)
并且程序返回0.
其他人可以用Visual Studio 2010重现这个吗?这是调试器中的错误吗?
c++ compiler-construction gcc debuggervisualizer visual-studio
此站点http://www.tldp.org/LDP/abs/html/gotchas.html#PARCHILDPROBREF表示脚本无法更改其父项的环境变量.
因此,(除非脚本来源)脚本不能在其父环境中意外更改巧合命名的环境变量.
但是,如果程序依赖于它声明的环境变量,则可能发生命名空间冲突.
例如,假设我不知道vim使用环境变量名称"VIMRUNTIME".而且,巧合的是,我碰巧将这个环境变量名称用于我自己的,不相关的目的.然后vim会从VIMRUNTIME环境变量中获取垃圾.
是否有任何机制或标准的,众所周知的命名约定来避免这种类型的命名空间冲突?当然,我可以做一些事情,比如使用某种前缀命名我的所有环境变量.但我想知道是否有任何众所周知的正式标准.或者,在Bash中是否存在某种我没有找到的命名空间机制?鼓励在评论中提出有关其他相关问题的建议.
在C++ 11中,可以使用可变的右值引用初始化const左值引用.然后,rvalue引用的值可以改变,从而产生可见的突变,即const lvalue指的是什么.这是一个例子:
int && rval = 3;
const int & lval = rval;
cout << "lval = " << lval << endl;
cout << "rval = " << rval << endl;
rval ++;
cout << "lval = " << lval << endl;
Run Code Online (Sandbox Code Playgroud)
输出(来自clang 3.2和gcc 4.8.2都使用-std = c ++ 11):
lval = 3
rval = 3
lval = 4
Run Code Online (Sandbox Code Playgroud)
我猜这个的原因是参考物不能通过左值参考修改,但可以通过右值参考修改.但是,我不明白为什么允许const左值引用可变对象.
有人可以解释这个的基本原理,并提供处理这种情况的最佳实践.还有其他类似的例子,其中constness可以被颠覆?
这个问题是密切相关的先前问了一个问题在这里.
为了使Visual Studio 2010 C++调试器能够解析类内初始化的const变量,必须提供变量的全局定义.
例如
这是类定义:
class B{
public:
static const int m_b=100;
};
Run Code Online (Sandbox Code Playgroud)
以下是该成员的全局范围定义:
const int B::m_b;
Run Code Online (Sandbox Code Playgroud)
没有全局定义代码可以工作,但调试器在B的方法中看不到m_b.
然而,这导致另一个问题.在非平凡的头文件包含安排(下面给出的完整代码)中,Visual Studio产生此链接错误:
error LNK2005: "public: static int const B::m_b" (?m_b@B@@2HB) already defined in a.obj
1>a.exe : fatal error LNK1169: one or more multiply defined symbols found
Run Code Online (Sandbox Code Playgroud)
但是,GCC成功编译,链接和运行代码.
这是有问题的代码:
文件a.cpp:
#include <iostream>
#include "a.h"
const int B::m_b;
int main()
{
B b;
std::cout << b.m_b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
档案啊:
#pragma once
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
文件b.cpp:
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
文件bh: …