德尔福2007/2009奇怪的问题在这里:
基于设计时定义的组件属性,可以将文件包含在链接中或保留它们吗?
示例:如果我将SomeProperty保留为true,则在编译时,单元SomeUnit将包含在我的项目中.否则将不包括在内.
我解决这个问题的第二种方法是部署第二个组件,当在表单中删除时(或不在表单中)将包含使用子句中的单元.但如果可以用财产来做,那就更好了.
我想通过IFDEF避免条件编译,因为这会强制每次构建项目时构建组件.或不?
我试图实现一个简单的方法,在项目中包含一些单位,然后这些单位将提供对特定数据库的支持.将这些选项放在连接组件中将非常简单:检查支持并完成.取消选中,并在已编译的APP中获得更少的KB.
编辑:我会继续使用组件方式.我知道IFDEF方法和事情,但这会强制每次构建项目时构建组件.或不?
我试图通过简单的方法将一些单元包含在项目中,然后这些单元将为特定数据库提供支持.将这些选项放在连接组件中将非常简单:检查支持并完成.取消选中,并在已编译的APP中获得更少的KB.
有没有人知道用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类或方法,以便在编译器评估时不发出代码?
我想编写有条件编译的代码,并根据以下两种情况:
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没有意义),但我不确定编译器是否会通过努力来证明
我有以下一点代码,我希望给定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
我的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,这两种功能都列出来,并在安装程序的功能完全一样,如果没有OneOnly或TwoOnly分别设置.为什么我的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) 我需要解析一个包含条件语句的文件,有时会嵌套在另一个文件中.
我有一个存储配置数据的文件,但配置数据略有不同,具体取决于用户定义的选项.我可以处理条件语句,它们都只是没有操作的布尔值,但我不知道如何递归地评估嵌套条件.例如,文件的一部分可能如下所示:
...
#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,但如果用另一种语言更容易解决这个问题,我可以切换这个功能.
有没有办法根据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文件中的注释.这里的替代方案是什么?
考虑一下代码.
#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文件除外?
编译文件时尝试在我的代码中应用默认值。
我需要在我的代码中将定义的关键字设置为某个值。
因此,当我编译代码并且它在编译器的参数中没有收到任何定义时,它将使用我的默认值。
我不确定如何做到这一点,但我有一点想法:
#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 作为其新设置?
通过阅读有关此的文档,我不太清楚。
针对特定需要,已更改了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]
任何的想法?