在Haskell世界中,什么是autotools的替代品?我希望能够在相同源代码的不同配置之间进行选择.
例如,Haskell中至少有两个MD5实现:Data.Digest.OpenSSL.MD5和Data.Digest.Pure.MD5.我想以这样的方式编写代码,它可以找出已安装的库,并且不需要安装另一个库.
在CI中可以使用Autotools/Scons/CMake + cpp.在Python中,我可以抓住ImportError.我应该在Haskell中使用哪些工具?
build-automation configuration haskell conditional-compilation
假设我有一个很长的算法,我想任选地详细调试它.到目前为止,我只是添加了很多if verbose then printf "whatever"代码,但是如果我不想在详细模式中使用它,这会强制代码执行许多无用的测试.
有没有办法获得一个简单的条件编译,如果设置了一个标志,它可以忽略printf行?
例如,我可以通过使用C来做的事情 #IFDEF DEBUG printf .. #ENDIF
每次在Visual Studio 2010中构建Visual C++解决方案时,整个项目(而不是整个解决方案)都会重新编译.
必须有一个标志或配置,以使VS只编译已更改的文件+依赖文件.它在哪里?
更新:
我正在使用XCode 4,在我的项目构建设置中,我设置了:
Preprocessor macros
Debug DEBUG;FULL
Release FULL
Run Code Online (Sandbox Code Playgroud)
在同一项目的另一个目标中:
Preprocessor macros
Debug DEBUG;LITE
Release LITE
Run Code Online (Sandbox Code Playgroud)
这两个目标使用完全相同的文件,但plist信息文件是不同的.
然后在我的代码中,我写道:
#ifdef FULL
// ###### FULL VERSION
NSLog(@"test");
// ######
#endif
Run Code Online (Sandbox Code Playgroud)
但是从未写过日志.
我究竟做错了什么 ?我不希望(需要)为FULL语句设置一个值.
我正在学习条件编译,我认为到目前为止我对它很了解.现在,如果我有代码:
#ifdef UMP_TO_FILE
//do something here...
#endif
Run Code Online (Sandbox Code Playgroud)
我跑:
gcc myprogram.c -DUMP_TO_FILE
Run Code Online (Sandbox Code Playgroud)
然后,代码块"//在这里做某事......"被编译.现在,我的问题是:
-DUMP_TO_FILE标志究竟是什么?
我认为标志是"-D"并且它定义了宏"UMP_TO_FILE",但是我想确定它的结构和"gcc --help"并没有告诉我任何关于这个的信息,也许我不知道如何在互联网上搜索这个!!
非常感谢您分享您的知识!
我正在尝试编写处理不同数字类型的类.我知道C#(和我一般认为.Net)没有INumber接口,所以我不能使用如下内容:
public class Adder<T> where T:INumber
{
public T Add(T a, T b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
不过没关系,因为我想避免我的每个号码的装箱/拆箱.但是,我可以为我想支持的每种类型使用条件编译:
#if FLOAT
public class AdderF
{
public float Add(float a, float b)
#else
public class Adder
{
public int Add(int a, int b)
#endif
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着我需要编写不同的Library.dll和LibraryF.dll,但是.有没有更优雅的解决方案呢?
显然,在我的例子中,我可以简单地编写代码两次.但是,我想使用此过程来创建具有整数版本和浮点版本的大型复杂数据结构,因此在更新结构时不希望出现复制粘贴错误的可能性.我也不希望速度损失将浮点结构包装在一个整体包装器中,并且不必要地将所有输入转换为更宽松的数据类型.
我相信该#ifdef __OBJC__指令可确保我仅为Objective-C导入以下类库。在ifdef语句之后列出类库的目的是什么?这个代码示例不是要达到目的吗?
#ifdef __OBJC__
#import <foundation/foundation.h>
#import <uikit/uikit.h>
#import <coredata/coredata.h>
#endif
</coredata/coredata.h></uikit/uikit.h></foundation/foundation.h>
Run Code Online (Sandbox Code Playgroud) 我得到了一个用C编码的开源项目.它使用#ifdef进行交叉编译.整个源代码中有很多ifdef.我想只为一个平台修改它.我想通过编译器的预处理器(Visual C++)来运行它,但它会将预处理的结果写入一个我不需要的文件.有人知道一种方法来预处理项目,保持其结构完整(所有文件完好无损)?请不要grep.
我发现了一个潜在的解决方案(这些天你可以在互联网上找到它真是太棒了).它是boost.wave - 一个C++预处理器库,可以做一些有趣的事情.我不知道结果如何,但我会尝试一下.不过,这不是最终答案,所以如果你有解决方案,那么我会很高兴听到它.
我想知道是否有可能构建不同的安装程序,其中包含一个部署项目的不同文件,完全取决于构建配置(调试/发布)?
我想这样做是因为:
我目前遇到的困难:
我有一个箱子,到目前为止,它不再需要某个功能。我想弃用它,但不知道如何。
到目前为止,我的计划是首先使其成为默认功能,但是接下来呢?
.net ×1
c ×1
c# ×1
deprecated ×1
gcc ×1
haskell ×1
import ×1
ios ×1
ios4 ×1
macros ×1
objective-c ×1
ocaml ×1
preprocessor ×1
rust ×1
rust-cargo ×1
unix ×1
visual-c++ ×1
xcode ×1