我想知道使用if
语句与#if
和#ifdef
语句是否是一种风格问题,或者功能上存在差异以及为什么要使用其他语句。
这是使用#ifdef
声明的正确方法吗?
#define variable 1
#ifdef variable //if variable is defined as 1?
//code
#endif
答案 0 :(得分:2)
#if
由预处理器使用,用于有条件地包含用于编译的代码段。一个典型的用法是必须为不同的操作系统(或不同的编译器)编译源文件:
#ifdef _WIN32
/* Something specific to windows. */
#else
/* Something not available on windows. */
#endif
if
语句用于在运行时控制程序流。
答案 1 :(得分:1)
所有以#
为前缀的指令由编译器编译之前运行的编译器的一部分处理,称为preprocessor。也就是说,对于示例中的代码,如果未定义variable
,编译器甚至不会看到#ifdef
和#endif
之间的代码。
答案 2 :(得分:1)
这两个语句由编译器的两个不同阶段执行:
#ifdef ...
由预处理器执行。它删除或保留完整的守卫部分代码。这是在编译时完成的,因此条件必须是编译时常量。如果#ifdef
排除了部分代码,则相应的代码不会进入已编译的可执行文件。
if (...)
由编译器处理,并转换为可执行代码。它的表达式可以在运行时计算。表达式的两面都保留在已编译的可执行文件 * 。
中* 除非优化器检测到可以删除一个部件;这并不常见。
答案 3 :(得分:1)
这种区别有一个重要原因:
代码1 -
#if SOMETHING
do_some_c_stuff();
#endif
代码2 -
#ifdef SOMETHING
do_some_c_stuff();
#endif
这就是为什么你经常会看到:
#ifdef SOMETHING
#if SOMETHING
do_some_c_stuff();
#endif
#endif
或其某些组合
答案 4 :(得分:0)
#ifdef
由编译器预处理,这意味着表达式不会在运行时计算。它通常用于检查编译标志。
答案 5 :(得分: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代码添加到项目中,当您切换到Release模式时(假设所有默认设置),您会注意到它内部的代码会“灰显”一下。这是Visual Studio,说明编译时灰色代码不会在当前配置中运行。
答案 6 :(得分:0)
编译器(gcc)处理#
的所有行。而不是在二进制(运行时)
这是使用#ifdef语句的正确方法吗? - >是
答案 7 :(得分:0)
#if
和#ifdef
在编译时进行评估,它们是预处理器指令。您在代码中命名为“variable”的项不是变量,而是一个数字常量,它将在代码编译之前用代码替换代码中出现的所有“变量”。所有这些预处理器指令只是指示编译器应如何将代码转换为二进制文件。
普通的if语句完全不同,它是实际程序本身的一部分,执行运行时检查,从而控制程序的“流程”。