标签: conditional-compilation

C++可变内存分配

这些主要是编译器设计问题.当您的编译器编译它时,例如:

int * pData = new int[256];

如何即时分配内存?编译器是否调用为您分配内存的OS例程,还是编译为您分配内存的函数?

此外,当你写这样的东西:

if (x == 5)
    int y;
Run Code Online (Sandbox Code Playgroud)

由于内存不是在运行时分配的,我假设数据占用了程序数据段的一些空间.由于编译器无法确定int y;分支是否将在运行时执行,因此是否为变量保留的内存是否int y;被执行?如果它是保留的,那么mem分配块中可能执行也可能不执行的任何变量的内存效率是否更高?

谢谢

c++ memory-management compiler-theory conditional-compilation new-operator

4
推荐指数
1
解决办法
4154
查看次数

使用或不使用DEBUG条件定义

在使用Debug Build Configuration编译项目时,我有一个想法在FullDebugMode中使用FastMM4.

当我选择Debug构建配置时,Delphi会自动将DEBUG设置为条件定义.所以,这段代码应该按预期工作:

unit uXTrackUpdater;

program Test;

uses
  {$IFDEF DEBUG}FastMM4,{$ENDIF}
  Forms;

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Test';
  Application.CreateForm(TfrmTest, frmMain);
  Application.Run;
Run Code Online (Sandbox Code Playgroud)

它有效.但是,当我将构建配置更改为Release配置时.这段代码也有效!它不应该?由于不应定义DEBUG条件.

因此,有人可以解释为什么这个代码执行而不管构建配置如何以及如何正确设置它(以仅在使用调试配置时编译FastMM4的方式).

编辑后

使用FastMM只是一个例子.在发布我的问题之前,我已经在不同的情况下测试了它.这里是:

program Project21;

{$APPTYPE CONSOLE}

uses
  {$IFDEF DEBUG} SysUtils; {$ENDIF}

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do  //should not be found after rebuilding with RELEASE build configuration
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

无论构建配置如何,上面的代码都将编译.为什么?

第二次编辑后

我知道,其他人说我的例子按预期工作.但他们不适合我.我在Delphi 2010上检查了这个行为,它是完全相同的(仍然无法正常工作).

也许这会有所帮助:我已经取代了DEBUG指令,RELEASE看看会发生什么.结果是RELEASE …

delphi build-process conditional-compilation delphi-2009

4
推荐指数
1
解决办法
2522
查看次数

C和Delphi中的条件编译

下一个模式在C代码中很常见:

#ifndef SOMETHING
#define SOMETHING
#endif
Run Code Online (Sandbox Code Playgroud)

这种模式在Delphi代码中也是可能的:

{$IFNDEF SOMETHING}
{$DEFINE SOMETHING}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

但这并不常见 - 我从来没有见过它.如果Delphi代码需要条件定义,它只是定义它而不IFNDEF检查.

为什么这样?C和Delphi之间条件编译的区别是什么ifndef,以便前者需要检查而后者不需要检查?

c delphi conditional-compilation ifndef

4
推荐指数
1
解决办法
1430
查看次数

基于一个代码库/项目创建演示和完整版应用程序

我在Eclipse的一个项目中开发了一个Android应用程序 - 它是结构化的(来自iPhone),所以一个常量定义它是演示版还是完整版.

现在我遇到的问题是,每次我想创建演示版本时我都需要更改常量,但还需要使用不同的包名创建项目的副本.

显然,原始完整版中的代码更改需要复制到演示中,否则我每次提交应用程序时都必须重做演示应用程序的创建.

我看到三种可能的方法:

1.虽然我已经研究过图书馆项目,但我仍然不清楚在这种情况下这是如何真正提供一个好的解决方案的.

例如,如果我有一个活动结构的完整版本:

A1
A2
A3
Run Code Online (Sandbox Code Playgroud)

使用实用程序类U1,U2

当然U1和U2可以在一个库项目中并从两个项目中引用 - 但是活动,strings.xml,图形,布局需要重复(或者是否有另一种我看不到的方式?)这似乎没有是一个很好的前进方式,遗憾的是,当提出这种方法时,在这个主题的类似问题中没有解释过.

2.另一种方法是根据不同的构建设置(类似于iPhone)创建不同的包名称,但是,这似乎不可能在Eclipse中使用而不是使用一些外部脚本(诚实地说 - 我宁愿避免使用它似乎相当容易出错)同时还必须在Eclipse之外调用编译

3.可能最直接的方法(目前还有很少的努力)只是手动复制项目,更改一个常量,重命名包并在每次提交时编译/导出.然而 - 这似乎是相当"基本"的,当然看起来并不专业(与iPhone/xCode构建设置/目标解决方案相比)

什么是最好的方法(需要最少量的变化,仍然稳定且易于使用)?

非常感谢!

编辑

对于尝试过tim解决方案的每个人来说 - 它运行正常,但我遇到了自定义属性的问题.

检查一下:如何在构建期间解决Android库自定义属性和包名重新映射? 它将解决图书馆的问题

android build conditional-compilation android-library

4
推荐指数
1
解决办法
3127
查看次数

如何预测具有签名数字类型的东西?

假设我有一些模板化代码,它执行以下操作:

T x = foo();
T y = -x;
Run Code Online (Sandbox Code Playgroud)

现在,如果T是非数字类型(或者没有实现一元减号),则编译将失败.但如果它是unsigned int,unsigned short等,它会成功,并带有警告.所以我希望能够做到

T x = foo();
if (/* magic condition */ {
    T y = -x;
}
Run Code Online (Sandbox Code Playgroud)

我可以写明文条件 - 在编译时或运行时检查 - T的类型是一些有符号的数字类型?例如使用typeid?

注意:

  • 断言也很好,但我想要更灵活的东西.

c++ polymorphism typeof conditional-compilation typeid

4
推荐指数
1
解决办法
115
查看次数

如何选择包含某些功能的某些代码?

在Inno Setup中,我有一个主要脚本是"核心系统",这意味着我们的软件完全需要安装/运行所需的一切.另外,我正在为每个主要功能编写脚本文件,这些功能可能会也可能不会编译到安装程序中.在主脚本文件的顶部,我包含其他脚本文件...

#include "AdditionalOption.iss"
#include "AnotherOption.iss"
Run Code Online (Sandbox Code Playgroud)

在编译这个主脚本时,编辑人员可以选择是否在安装程序中编译这些特定选项(由于各种原因而备用文件大小).

当主脚本中的特定代码依赖于其中一个附加脚本中的某些内容时,会出现问题.例如...

procedure InitializeWizard();
begin
  //Creates custom wizard page only if "AdditionalOption.iss" is compiled
  CreatePageForAdditionalOption; 
  //Creates custom wizard page only if "AnotherOption.iss" is compiled
  CreatePageForAnotherOption; 
end;
Run Code Online (Sandbox Code Playgroud)

InitializeWizard只能定义一次,但我需要有条件地调用代码,具体取决于是否包含其他脚本.这些过程驻留在相应的脚本文件中,因此如果用户排除了其他脚本文件,它们当然不存在.

在Delphi中,我可以使用这样的条件:

{$DEFINE ADD_OPT}
{$DEFINE ANO_OPT}

procedure InitializeWizard();
begin
  {$IFDEF ADD_OPT}
  CreatePageForAdditionalOption;
  {$ENDIF}
  {$IFDEF ANO_OPT}
  CreatePageForAnotherOption;
  {$ENDIF}
end;
Run Code Online (Sandbox Code Playgroud)

当然这不是Delphi.我如何在Inno Setup中做这样的事情?

inno-setup conditional-compilation

4
推荐指数
1
解决办法
1459
查看次数

#define中的#error - 可能在C++中(在调用宏MyMacro时生成错误如果没有定义某个常量)?

我想定义宏,基于某些条件(存在#define INITED,而不是宏的参数)将返回值,或生成编译器的错误,如:

#error Not initialized!
Run Code Online (Sandbox Code Playgroud)

我试过(for myIdea.h):

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #define MyMacro(x) #error Not initalized!
#endif
Run Code Online (Sandbox Code Playgroud)

但是那段代码会产生错误(不是我想要的错误)expected macro format parameter.

请注意,我不想要那些代码(工作,但做一些不同的事情):

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #error Not initalized!
#endif
Run Code Online (Sandbox Code Playgroud)

上面的代码只会在不定义INITED时生成错误.我想只在我调用MyMacro()AND INITED尚未定义时才生成错误.

我不是第一个代码的奴隶,但我希望结果完全按照我上面描述的方式工作(生成错误WHEN调用宏MyMacro IF常量inited未定义).

c c++ macros conditional-compilation ifdefine

4
推荐指数
1
解决办法
728
查看次数

如何在编译时检查DMD版本?

我可以测试DMD正在使用编译给定代码version(DMD){},但是如何检查它的哪个版本?(2.66/2.65等)

更简洁地说,我想检查@nogc修改器是否存在,如果不存在 - 定义一个虚拟修改器.

我提出了一个解决方法:

static if(!__traits(compiles, ()@nogc{}))
{
    struct nogc;
}
Run Code Online (Sandbox Code Playgroud)

但有更好的方法吗?例如,甚至直接检查特定修饰符的存在?

d version conditional-compilation dmd

4
推荐指数
1
解决办法
233
查看次数

如何排除在OS X上构建文件?

我有src/bin/linux-only.rs一些只在Linux上工作的东西(例如只存在于Linux上的libc绑定).我想将该文件排除在OS X上.

我开始#[cfg(target_os = "linux")]使用每个块,linux-only.rs但是这会使源代码更加混乱.

有没有更好的方法来做到这一点?

conditional-compilation rust rust-cargo

4
推荐指数
1
解决办法
240
查看次数

DEBUG vs RELEASE和分发大会

我正在为其他开发人员创建和分发程序集以供使用.我正在分发我的程序集的发布版本(而不是调试版).在我的程序集的一个类中,我将代码设置为仅在调试模式下运行

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif
Run Code Online (Sandbox Code Playgroud)

如果其他开发人员从他们的项目中引用我的程序集并在调试模式下运行他们的项目,那么我的调试是否只有条件运行?

.net c# conditional-compilation

4
推荐指数
1
解决办法
237
查看次数