我知道vb.net中不存在#warning指令......有什么类似的吗?
我希望能够在编译时抛出消息(警告).
我正在查看一些C#代码,并且遇到了以下声明:
#if DEBUG
// Do something here
#else
// Do something else
#endif
Run Code Online (Sandbox Code Playgroud)
我假设DEBUG将在某处定义如下:
#define DEBUG
Run Code Online (Sandbox Code Playgroud)
但我无法找到这样的定义,尽管代码似乎表现得像设置的那样.DEBUG是一个特例,如果是这样,它是如何设置/取消设置的?
有没有人知道我在MonoTouch中使用的编译器指令,看看我是否在iPhone模拟器中运行?无法在任何地方找到任何信息.
谢谢!
我有这段代码:
INTERFACE
{$WARN SYMBOL_PLATFORM OFF}
USES
Winapi.Windows, etc, {$IFDEF MSWINDOWS}Vcl.FileCtrl, {$ENDIF} System.IniFiles;
{$WARN SYMBOL_PLATFORM ON}
Run Code Online (Sandbox Code Playgroud)
编译器显示:
[dcc32警告] W1005单元'Vcl.FileCtrl'特定于平台
即使{$ WARN SYMBOL_PLATFORM OFF}在那里.
为什么?
In C, I could declare a compiler directive as follows:
#define MY_NUMBER 10
Run Code Online (Sandbox Code Playgroud)
However, in C#, I only appear to be able to do this:
#define MY_NUMBER
Run Code Online (Sandbox Code Playgroud)
Which is obviously useless in this case.
Is this correct, or am I doing something wrong? If not, can anyone suggest a way of doing this, either at namespace or solution level? I thought of maybe creating a static class, but that seems to be overkill for one value.
我发现在Controls.pas(以及其他单位)中声明了这个指令,我很高兴知道这是什么意思.
{$C PRELOAD}
Run Code Online (Sandbox Code Playgroud)
据我所知,$ C表示断言控制,但PRELOAD关键字是什么?这是"在预加载时断言我"吗?
我在Delphi 2009中发现了这一点
谢谢
我正在尝试知道项目是否是一个库,在阅读帮助后我写了这段代码不起作用:
{$IF DEFINED(LIBPREFIX)}
{$DEFINE PROJECT_IS_EXECUTABLE}
{$UNDEF PROJECT_IS_LIBRARY}
{$ELSE}
{$DEFINE PROJECT_IS_EXECUTABLE}
{$UNDEF PROJECT_IS_LIBRARY}
{$IFEND}
Run Code Online (Sandbox Code Playgroud)
我试过DEFINED,DECLARED和
{$IF (LIBPREFIX = '')}
Run Code Online (Sandbox Code Playgroud)
每次尝试总是为DLL和程序返回相同的内容.如何仅使用内置编译器指令执行此操作?
编辑
我的目的是从"PE文件"中删除额外的信息.
我直接在.dpr项目文件中进行,所以不管其他单元是如何编译的,但我不能在DLL项目中做同样的事情.
因此我正在寻找一种方法来阻止它在DLL项目中.
这就是我解决这个问题的方法,我将这个指令添加到我的.dpr程序中:
{$DEFINE STRIPE_PE_INFO}
{$DEFINE STRIPE_RTTI}
{$I DDC_STRIP.inc}
Run Code Online (Sandbox Code Playgroud)
并且DDC_STRIP.inc具有所有逻辑.
在我的MonoTouch应用程序中,如何在调试模式下输入#compiler指令以包含代码?
我被要求保留一些不像遗产一样的代码,并且它充满了编译器指令,使它几乎不可读,几乎可维护.例证:
#if CONDITION_1
protected override void BeforeAdd(LogEntity entity)
#else
protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
{
#if CONDITON_1
entity.DateTimeInsert = DateTime.Now;
#else
((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
base.BeforeAdd(entity);
}
Run Code Online (Sandbox Code Playgroud)
using 指令甚至更漂亮:
#if CONDITION_1
using CompanyName.Configuration;
#endif
#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif
Run Code Online (Sandbox Code Playgroud)
我以为我会ConditionalAttribute放手一搏,但在这种情况下这不会奏效
有什么方法可以解决这个编译器指令的噩梦吗?
代码是针对编译的.NET 3.5.
更新:
Oded回答建议删除BeforeAdd方法周围的编译器指令,从而使其重载.不幸的是,这两个方法都不会起作用,因为两个方法都应该覆盖一个AbstractBusiness类,它提供两种不同的实现,具体取决于最终包含哪些程序集:
protected virtual void BeforeAdd(TEntity entity) {}
Run Code Online (Sandbox Code Playgroud)
要么
protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}
Run Code Online (Sandbox Code Playgroud)
此代码从过去一段时间创建的一组库中获取其依赖关系,并且从那时起一直在"升级".他们现在有4个不同版本的库,其中包含冲突的命名空间和不同的实现.所有这些都与使用(非常)旧版本的应用程序的"向后兼容性"有关.
我最终选择了@Oded的答案,因为它作为一种通用方法最有意义( …
c# ×5
delphi ×3
xamarin.ios ×2
.net ×1
.net-3.5 ×1
c#-3.0 ×1
c++ ×1
copy-elision ×1
delphi-xe7 ×1
diagnostics ×1
directive ×1
preprocessor ×1
vb.net ×1