English 中文(简体)
为什么有人会使用#if 1 C预处理指令?
原标题:Why would somebody use an #if 1 C preprocessor directive?

我正在查看一些C源代码,但是我不理解以下部分。

#if 1

   typedef unsigned short PronId;
   typedef unsigned short LMId;
#  define LM_NGRAM_INT

#else

   typedef unsigned int LMId;
   typedef unsigned int PronId;
#  undef LM_NGRAM_INT

#endif

为什么有人要做#if 1?难道不是只有第一个块会被执行的吗?

最佳回答

是的..只有第一个块将被处理--直到有人将1改为0。然后编译另一个块。这是在测试不同算法时临时切换代码块的方便方式。

问题回答

这样就可以通过将#if 1 更改为#if 0 来快速选择要编译的部分。

软件的基本特性之一是计算机程序修改便宜

这就是为什么某些代码被编写成这样,这样可以更容易地进行修改。这就是为什么他们需要各种模式,比如“接口”或“代理”。

这就是为什么有时你会看到奇怪的构建,如#if 1-#else-#endif,它的唯一目的是通过小的努力轻松切换将要编译的代码部分:将1改为0。

当我需要测试不同的参数组合时,我会将其放入我的代码中。通常,我的产品将以与调试环境中使用的不同默认值发货,因此我将发货默认值放在#if 1中,将调试默认值放在#else中,并使用#warning警告我正在使用调试默认值构建程序。

用来尝试不同的代码路径。

这只是注释大量代码的另一种方式,这样编辑器自动缩进就不会破坏缩进(注释的代码块将缩进为文本,而不是代码)。

我实际上把它用作临时方法,以便更轻松地进行代码折叠; 如果我在代码块中包装一个#if 1 ... #endif,我就可以在我的编辑器中折叠它。 (涉及的代码非常宏重,不是我编写的,因此传统的使大块代码可管理的方法不起作用。) 我实际上把它用作临时方法,以便更轻松地进行代码折叠; 如果我在代码块中包装一个#if 1 ... #endif,我就可以在我的编辑器中折叠它。 (涉及的代码非常宏重,不是我编写的,因此传统的使大块代码可管理的方法不起作用。)

更清洁的做法可能是这样做:

#if ALGO1

#else

#endif

但你必须在编译器参数中传递ALGO1......例如,在一个makefile中,你需要添加-DALGO1=1(如果没有1,则假定为1)。参考:http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

这是更多的工作... 因此,通常用#if 1 进行快速检查。有时也会被忘记并留下 :-)

这是另一种说法,表示#if true很可能是之前检查另一个符号的代码经过重构后始终为真的结果。





相关问题
Can you #define a comment in C?

I m trying to do a debug system but it seems not to work. What I wanted to accomplish is something like this: #ifndef DEBUG #define printd // #else #define printd printf #endif Is there a ...

C Programming: Preprocessor, macros as tokens

I m trying to do something that is conceptually similar to this, but can t seem to get it to work (error shown at end) any ideas? #include <stdio.h> int main( int argc , char const *argv[] ) { ...

Testrun preprocessor statement

Is there a way to set a constant depending on whether unit tests are run? The problem with the unit test framework is de way it deals with dependencies; it will copy files but it does not seem to ...

C macro processing

I m thinking about best way to write C define processor that would be able to handle macros. Unfortunately nothing intelligent comes to my mind. It should behave exactly like one in C, so it handles ...

Macros as arguments to preprocessor directives

Being faced with the question whether it s possible to choose #includes in the preprocessor I immediately thought not possible. .. Only to later find out that it is indeed possible and you only need ...

See what the preprocessor is doing

Is there anyway to see what you code looks like after the preprocessor has done all the substitutions?

Removing macro in legacy code

I have a lot of legacy code using macro of the form: #define FXX(x) pField->GetValue(x) The macro forces variable pField be in the scope: ..... FIELD *pField = .... ..... int i = FXX(3); int j = ...

热门标签