0

我想知道使用if语句与#if#ifdef语句是否是一种风格问题,或者在功能上是否存在差异,以及为什么你会使用一个而不是其他的。

这是你使用#ifdef语句的正确方式吗?

#define variable 1

#ifdef variable      //if variable is defined as 1?
//code
#endif
4

8 回答 8

2

#if由预处理器使用,用于有条件地包含要编译的代码段。一个典型的用途是必须为不同的操作系统(或不同的编译器)编译源文件:

#ifdef _WIN32
/* Something specific to windows. */
#else
/* Something not available on windows. */
#endif

if语句用于在运行时控制程序的流程。

于 2012-09-25T15:33:18.210 回答
1

这两条语句由编译器的两个不同阶段执行:

#ifdef ...

由预处理器执行。它删除或保留其受保护的代码部分。这是在编译时完成的,因此条件必须是编译时常量。如果部分代码被 排除#ifdef,则相应的代码不会进入编译的可执行文件。

if (...)

由编译器处理,并转换为可执行代码。它的表达式可以在运行时计算。表达式的两边都保留在编译的可执行文件*中。


*除非优化器检测到可以移除一个部分;这并不常见。

于 2012-09-25T15:34:02.940 回答
1

这种区别有一个重要原因:

代码 1 -

#if SOMETHING
    do_some_c_stuff();
#endif
  1. 如果“SOMETHING”为真,我们将调用 do_stuff 函数
  2. 如果“SOMETHING”为假,则不会编译此代码。
  3. 如果您的代码库中未定义“SOMETHING”,则不进行编译。

代码 2 -

#ifdef SOMETHING
    do_some_c_stuff();
#endif
  1. 如果定义了“SOMETHING”(真或假),我们将调用 do_some 函数
  2. 如果您的代码库中未定义“SOMETHING”,则不会编译此代码

这就是为什么你会经常看到:

#ifdef SOMETHING
#if SOMETHING
    do_some_c_stuff();
#endif
#endif

或它们的某种组合

于 2012-09-25T15:48:19.823 回答
1

所有以 为前缀的指令都由在编译之前#运行的编译器的一部分处理,称为预处理器。也就是说,对于您示例中的代码,如果未定义,则编译器甚至不会看到之间的代码。variable#ifdef#endif

于 2012-09-25T15:32:58.240 回答
0

#ifdef由编译器预处理,这意味着表达式不会在运行时计算。它通常用于检查编译标志。

于 2012-09-25T15:33:55.703 回答
0

http://msdn.microsoft.com/en-us/library/4y6tbswk(v=vs.100).aspx

Cliffs:它#if在编译时评估,并根据结果,它在#if...内的代码块中执行代码#endif。常见用途:

#if DEBUG
    // Do some additional logging here we don't want to to in release.
#endif

如前所述,您无权访问局部变量,预处理器指令访问您定义的内容。默认情况下,在 Visual Studio 中,DEBUG当您将模式设置为Debug. 如果您将上面的#if DEBUG 代码添加到项目中,您会注意到当您切换到发布模式(假设所有默认设置)时,其中的代码会“变灰”一点。这是 Visual Studio 说,当您编译时,灰色的代码不会在当前配置中运行。

于 2012-09-25T15:34:12.713 回答
0

我们的所有行#都由编译器(gcc)处理。并且不在二进制文件中处理(运行时)

这是您使用#ifdef 语句的正确方法吗?--> 是的

于 2012-09-25T15:35:11.307 回答
0

#if#ifdef在编译时进行评估,它们是预处理器指令。您在代码中命名为“变量”的项目不是变量,而是一个数字常量,它将在代码编译之前将代码中所有出现的“变量”替换为 1。所有这些预处理器指令只是向编译器指示它应该如何将您的代码转换为二进制文件。

普通的 if 语句完全不同,它是实际程序本身的一部分,执行运行时检查,从而控制程序的“流程”。

于 2012-09-25T15:37:02.933 回答