标签: conditional-compilation

是否可以根据组件属性包含文件(链接)?

德尔福2007/2009奇怪的问题在这里:

基于设计时定义的组件属性,可以将文件包含在链接中或保留它们吗?

示例:如果我将SomeProperty保留为true,则在编译时,单元SomeUnit将包含在我的项目中.否则将不包括在内.

我解决这个问题的第二种方法是部署第二个组件,当在表单中删除时(或不在表单中)将包含使用子句中的单元.但如果可以用财产来做,那就更好了.

我想通过IFDEF避免条件编译,因为这会强制每次构建项目时构建组件.或不?

我试图实现一个简单的方法,在项目中包含一些单位,然后这些单位将提供对特定数据库的支持.将这些选项放在连接组件中将非常简单:检查支持并完成.取消选中,并在已编译的APP中获得更少的KB.

编辑:我会继续使用组件方式.我知道IFDEF方法和事情,但这会强制每次构建项目时构建组件.或不?

我试图通过简单的方法将一些单元包含在项目中,然后这些单元将为特定数据库提供支持.将这些选项放在连接组件中将非常简单:检查支持并完成.取消选中,并在已编译的APP中获得更少的KB.

delphi pascal conditional-compilation

2
推荐指数
1
解决办法
557
查看次数

C#中的条件编译技术可以获得无操作结果

有没有人知道用C#中的无操作替换某些函数调用的好方法(通过反射或特殊属性)?

基本上,我想要做的就是这样

#ifdef DEBUG

StopWatch.start();

#endif

DoSomething();

#ifdef DEBUG

StopWatch.stop();
Log.TimingInfo(StopWatch);

#endif
Run Code Online (Sandbox Code Playgroud)

在我的代码中没有遍布很多ifdef.我可以用空对象模式替换它(我的StopWatch类)并有条件地为它分配空对象,但与代码中的严格无操作相比,这仍然不理想.代码路径长度在这里非常重要,当我们不尝试收集时序结果时,我宁愿牺牲一些读取能力来完全没有操作.

有没有人知道是否有办法在C#中标记我的StopWatch类或方法,以便在编译器评估时不发出代码?

c# optimization conditional-compilation c-preprocessor

2
推荐指数
1
解决办法
827
查看次数

C++使用`const int`作为循环变量?

我想编写有条件编译的代码,并根据以下两种情况:

CASE_A:

    for(int i = 1; i <= 10; ++i){
        // do something...
    }
Run Code Online (Sandbox Code Playgroud)

CASE_B:(==!CASE_A)

    {
        const int i = 0;
        // do something...
    }
Run Code Online (Sandbox Code Playgroud)

也就是说,在A的情况下,我希望在变量上有一个正常的循环,i但是在B的情况下,我想将局部范围变量限制i为仅特殊情况(在此指定为i = 0).显然,我可以写一些东西:

    for(int i = (CASE_A ? 1 : 0); i <= (CASE_A ? 10 : 0); ++i){
         // do something
    }
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢这种设计,因为它不允许我利用const特殊情况B中的声明.这样的声明可能会允许大量的优化,因为这个循环的主体从潜在的编译时间中获益很大i以其恒定值替换.

期待社区提供有关如何有效实现这一目标的任何提示.

谢谢!

EDITS:

可以在编译时评估CASE_A与CASE_B.

i 不作为参考传递

i没有在体内重新评估(否则const没有意义),但我不确定编译器是否会通过努力来证明

c++ conditional-compilation

2
推荐指数
1
解决办法
2326
查看次数

如果在翻译单元中定义了标签,则通过ifdef以编程方式确定

我有以下一点代码,我希望给定cstdio包含第一行将打印,但第二行打印.

我究竟做错了什么?是否可以知道在编译时是否在当前翻译单元中定义了printf或strncmp或memcpy等标签?

#include <iostream>
#include <cstdio>

int main()
{
   #ifdef printf
      std::cout << "printf is defined.\n";
   #else
      std::cout << "printf NOT defined!\n";
   #endif
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

原因是因为在将变量和标签引入范围/ TU之前运行预处理器?

总之是以下代码伪造?:

http://code.google.com/p/cmockery/source/browse/trunk/src/example/calculator.c#35

c++ label conditional-compilation

2
推荐指数
1
解决办法
255
查看次数

为什么我的ifndef部分不起作用?

我的program.wxs文件中有以下代码段:

<?ifndef $(var.TwoOnly) ?>
        <Feature Id="FeatureOne" ... >
          ...
        </Feature>
<?endif ?>

<?ifndef $(var.OneOnly) ?>
        <Feature Id="FeatureTwo" ... >
          ...
        </Feature>
<?endif ?>
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令编译它:

candle -dOneOnly=1 program.wxs
Run Code Online (Sandbox Code Playgroud)

望着编译program.wixobj,我可以看到两个特性的声明都在那里,并运行后light,这两种功能都列出来,并在安装程序的功能完全一样,如果没有OneOnlyTwoOnly分别设置.为什么我的ifndef块无法正常工作?

注意:我还有以下内容:

<?ifdef $(var.OneOnly) ?>
  <?define productName = One Only ?>
<?else?>
  <?ifdef $(var.TwoOnly) ?>
    <?define productName = Two Only ?>
  <?else?>
    <?define productName = Both ?>
  <?endif?>
<?endif?>
Run Code Online (Sandbox Code Playgroud)

即使OneOnly在编译期间设置,该名称也显示为Both.

编辑

我已将条件的复杂性降低到文档中显示的最小情况:

<?ifndef $(var.TwoOnly) ?> …
Run Code Online (Sandbox Code Playgroud)

wix conditional-compilation

2
推荐指数
1
解决办法
1577
查看次数

解析嵌套的条件语句

我需要解析一个包含条件语句的文件,有时会嵌套在另一个文件中.

我有一个存储配置数据的文件,但配置数据略有不同,具体取决于用户定义的选项.我可以处理条件语句,它们都只是没有操作的布尔值,但我不知道如何递归地评估嵌套条件.例如,文件的一部分可能如下所示:

...
#if CELSIUS
    #if FROM_KELVIN ; this is a comment about converting kelvin to celsius.
        temp_conversion = 1, 273
    #else
        temp_conversion = 0.556, -32
    #endif
#else
    #if FROM_KELVIN
        temp_conversion = 1.8, -255.3
    #else
        temp_conversion = 1.8, 17.778
    #endif
#endif
...
Run Code Online (Sandbox Code Playgroud)

...而且,有些条件没有#else声明,只是#if CONDITION statement(s) #endif.

我意识到,如果文件只是用XML编写,或者其他东西用一个很好的解析器开始,这可能很容易,但这是我必须要处理的,所以我想知道是否有任何相对简单的方法来解析这个文件.它类似于括号匹配,所以我想它会有一些模块,但我没有找到任何东西.

我正在使用python,但如果用另一种语言更容易解决这个问题,我可以切换这个功能.

python regex conditional-compilation

2
推荐指数
1
解决办法
2793
查看次数

如何使Qt项目文件(.pro)平台依赖?

有没有办法根据Qt-Creator的操作系统包含不同的库?

换句话说,.pro文件中是否存在以下行的等效项:

#ifdef Q_WS_WIN
include(C:/myProject/myLybrary/my-lib.pri)
#endif

#ifdef Q_WS_X11
include(/home/user/myProject/myLybrary/my-lib.pri)
#endif
Run Code Online (Sandbox Code Playgroud)

我知道字符'#'标识.pro文件中的注释.这里的替代方案是什么?

qt conditional-compilation include qt-creator project-files

2
推荐指数
2
解决办法
6429
查看次数

#ifndef可以忽略方法或变量重复吗?

考虑一下代码.

#ifndef FOO_H
#define FOO_H
//Code
#endif
Run Code Online (Sandbox Code Playgroud)

代码可以是以下情况

// Case 1: 
#define foo 0
Run Code Online (Sandbox Code Playgroud)
// Case 2:
void foo_method(){};
Run Code Online (Sandbox Code Playgroud)
// Case 3:
int foo;
Run Code Online (Sandbox Code Playgroud)

foo.h包含在许多C文件中.当我只编译案例1没有错误时,其他情况会抛出重复错误.

为什么foo.h在编译时没有连接到C文件除外?

c conditional-compilation ifndef

2
推荐指数
1
解决办法
96
查看次数

预处理器参数和在 C 中编译 #ifndef #ifdef

编译文件时尝试在我的代码中应用默认值。

我需要在我的代码中将定义的关键字设置为某个值。

因此,当我编译代码并且它在编译器的参数中没有收到任何定义时,它将使用我的默认值。

我不确定如何做到这一点,但我有一点想法:

#ifndef MAXWORKLOAD
#define MAXWORKLOAD 10
#endif
Run Code Online (Sandbox Code Playgroud)

因此,如果我将其放入代码中并在参数中使用此命令行:

gcc -W -Wall 
Run Code Online (Sandbox Code Playgroud)

它会使用 10 有默认吗?

如果我在编译时使用这个命令行:

gcc -W -Wall -DMAXWORKLOAD=5
Run Code Online (Sandbox Code Playgroud)

它将使用 5 作为其新设置?

通过阅读有关此的文档,我不太清楚。

c conditional-compilation c-preprocessor ifndef

2
推荐指数
1
解决办法
1596
查看次数

编译之前,请验证文件版本是否正确

针对特定需要,已更改了Delphi自己的LIB的文件。由于我们有几个程序员,因此我需要确保每个人以及以后都进行此更改。

由于已安装Delphi库且未对它们进行版本控制,因此我需要验证其版本是否正确。

我想在编译版本之前执行此操作。

我能做的是创建文件的哈希,因此我确保它没有被修改

{$IF  getMD5('C:\Delphi7\Lib\arquivo.dcu') = 'B1C1CBE80477S09AC4C1B39C28FE9619'}
    {$Message Fatal 'Version of file .dcu file in Delphi7 Lib is wrong..}
{$IFEND}
Run Code Online (Sandbox Code Playgroud)

那样就行不通了,因为每时每刻都返回 [Fatal Error]

任何的想法?

delphi conditional-compilation delphi-7

2
推荐指数
1
解决办法
130
查看次数