我试图在我的.cpp文件中包含2个特定于平台的stdafx.h文件,但是当我尝试#ifdef时编译器不满意.
#ifdef _WIN32
#include "stdafx.h"
#elif _MAC
#include "MAC/stdafx.h"
#endif
Run Code Online (Sandbox Code Playgroud)
您可能想知道为什么我在Mac代码中使用stdafx.h,但目前并不重要:).
当我尝试在Windows上编译代码时,我收到:致命错误C1018.我尝试用#ifdef将其他头文件封装在同一个文件中,编译器很高兴.因此,看起来Windows不喜欢stdafx.h是#ifdef-ed,或者Windows只允许#include stdafx.h 成为文件中的第一行.
所以我的问题是,为什么?
吉
是否可以在包含多行字符串文字的Haskell代码上使用CPP扩展?Haskell还有其他条件编译技术吗?
例如,我们来看看这段代码:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Run Code Online (Sandbox Code Playgroud)
如果我取消注释{-# LANGUAGE CPP #-},那么GHC会用一个词法错误来反驳这段代码:
[1 of 1] Compiling Main ( cpp-multiline.hs, cpp-multiline.o )
cpp-multiline.hs:4:17:
lexical error in string/character literal at character 'o'
Run Code Online (Sandbox Code Playgroud)
使用GHC 6.12.1,可以使用cpphs.
我确认使用cpphs.compat包装器和-pgmP cpphs.compat选项有帮助,但我希望有一个不依赖于自定义shell脚本的解决方案.-pgmP cpphs不起作用.
PS我需要为GHC <6.12和GHC> = 6.12使用不同的代码,是否可以不使用预处理器?
UPD.除了接受Ganesh的答案之外,我还发现另一个解决方法是将所有条件声明放在一个单独的模块中{-# LANGUAGE CPP #-},从而避免使用多行字符串的模块中的CPP.
是否有任何工具可以为Delphi单元生成依赖关系图,同时考虑条件编译指令.我想强调一下,这应该是单元依赖图,而不是类依赖.此外,能够重新排列和隐藏生成的图表中的某些部分也是很好的.
我已经尝试了解并且它似乎没有做我想要的.
我刚试过
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
{$IFDEF CONSOLE}
beep;
{$ENDIF}
end.
Run Code Online (Sandbox Code Playgroud)
并期望beep在运行期间听到,但不是.但是,以下测试有效:
if IsConsole then
beep;
Run Code Online (Sandbox Code Playgroud)
为什么编译时测试不起作用?据我所知,从这份文件来看,它确实应该有效.
delphi conditional-compilation console-application compile-time
在C#中使用条件编译代码的替代方法是什么?
我有一个类,有很多基于#ifdef的代码..过了一段时间我的代码是不可读的.
寻找重构技术,以便更好地阅读和维护具有许多#ifdefs 的代码
我正在创建一个框架,如果你愿意,可以使用CoreData.该框架还具有CoreData之外的功能.如何在IfDef中包装所有CoreData特定代码,检查CoreData框架是否可用?
core-data objective-c conditional-compilation ios ios-frameworks
使用Coffeescript我需要经历一个构建脚本来更新我的.js文件,我有两个,一个用于调试,一个用于生产(一个使用Uglify来最小化文件,一个不使用).所以我认为使用一些条件编译也很方便,代码只能进入调试版本.
实现这一目标的最简单方法是什么?理想情况下,我可以通过简单的命令行开关来控制咖啡或uglify?
我正在使用C#Xamarin iOS项目在VS 2013中工作。我想添加一个条件编译符号,而不影响其他任何人,也不必进入Configuration Manager并说复制Debug(主要是这样,如果有人修改了Debug,我不会错过更改)。
我读过几篇文章,尝试将类似的内容添加到csproj.user文件中...
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DefineConstants>$(DefineConstants);__MY_NEW_SYMBOL__</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
...但这只是删除了该项目的所有其他符号。
有没有一种方法可以修改csproj.user文件以实现此目的?
c# projects-and-solutions conditional-compilation csproj-user
我试图修改我的Delphi 2010代码以在XE7中编译(并希望保留在2010年编译它的能力).因此,在我的mainform的单元中,我添加了条件指令.以下工作在2010年正常
uses
{$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
Run Code Online (Sandbox Code Playgroud)
但是XE7会自动System.Actions在最后添加一个用于创建一个uses子句,该子句现在已经声明了两次System.Actions(见下文),并给出了一条错误消息[dcc32 Error] MyForm.pas(10): E2004 Identifier redeclared: 'System.Actions'.为什么XE7不接受条件指令中的单位?
uses
{$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
System.Actions; // <- automatically added
Run Code Online (Sandbox Code Playgroud) 我试图实现类似于C#预处理器的东西.我知道Java没有相同的预处理器功能,并且我知道有很多方法可以使用Factory等设计模式来实现类似的结果.但是,我仍然有兴趣找到这个问题的解决方案.
目前,我所做的是创建一个包含几个静态最终布尔属性的类,例如以下示例:
public class Preprocessor
{
public static final boolean FULLACCESS = false;
}
Run Code Online (Sandbox Code Playgroud)
然后我以下列方式使用它:
public ClassName getClassName()
{
if(Preprocessor.FULLACCESS)
{
return this;
}
else
{
return this.DeepCopy();
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这很好,这解决了我的问题(上面的例子是微不足道的,但我确实在其他有用的情况下使用它).我的问题是,是否有办法将条件置于整个方法周围,以便在给定正确的"预处理器"变量的情况下方法本身不可用?例如,我希望能够使特定的构造函数仅适用于给定"完全访问"的包,如下所示:
public ClassName()
{
// do things
}
if(FULLACCESS)
{
public ClassName(ClassName thing)
{
// copy contents from thing to the object being created
}
}
Run Code Online (Sandbox Code Playgroud)
我再次意识到Java作为一种语言的局限性(或设计决策),并且我知道在大多数情况下这是不必要的.事实上,我已经考虑过简单地创建这些"额外"方法并将它们的整个代码放在条件中,同时如果条件不活动则抛出异常,但这是一个非常粗略的解决方案似乎没有用处当我向他们提供这些库时,我的程序员.
非常感谢您提前寻求帮助.
编辑:
为了补充这个问题,我试图这样做的原因是,通过使用异常作为解决方案,IDE实际上不会将方法显示为"可用".然而,再一次,它可能仅仅是我对Java的无知.
我想要这样做的原因主要是因为我可能有多个公共接口可用,例如,一个限制性,其中控制在方法中更严格,另一个允许直接改变属性.但是,我也希望能够从.class中主动删除部分代码,例如,在某些变体不可用的产品线开发方法中.
EDIT2:
此外,重要的是要注意我也将有条件地生成文档.因此,每个编译版本的软件包都有自己的文档,只包含实际可用的文档.
delphi ×3
c# ×2
preprocessor ×2
coffeescript ×1
compile-time ×1
core-data ×1
csproj-user ×1
delphi-2010 ×1
delphi-xe7 ×1
dependencies ×1
ghc ×1
haskell ×1
ios ×1
java ×1
objective-c ×1
processor ×1
stdafx.h ×1
uglifyjs ×1