Tag: c-preprocessor

MIN and MAX in C

The Question : 324 people think this question is useful Where are MIN and MAX defined in C, if at all? What is the best way to implement these, as generically and type safely as possible? (Compiler extensions/builtins for mainstream compilers preferred.) The Question Comments : The Answer 1 421 people think this answer is

C语言 – #include 和#include“filename”有什么区别?

在C和C ++编程语言中,使用尖括号和在include语句中使用引号有什么区别,如下所示? #include <filename> #include "filename" 答案 实际上,区别在于预处理器搜索包含文件的位置。 对于#include <filename>预处理器以依赖于实现的方式搜索,通常在编译器/ IDE预先指定的搜索目录中。此方法通常用于包括标准库头文件。 对于#include "filename"预处理器首先在与包含该指令的文件相同的目录中进行搜索,然后按照用于#include <filename>表单的搜索路径进行搜索。此方法通常用于包括程序员定义的头文件。 有关搜索路径的GCC 文档中提供了更完整的描述。 <和>之间的字符序列唯一地引用标题,该标题不一定是文件。实现几乎可以随意使用字符序列。(但是,大多数情况下,只需将其视为文件名并在包含路径中进行搜索,就像其他帖子所述。) 如果使用#include "file"表单,则实现首先查找给定名称的文件(如果支持)。如果不是(支持),或者搜索失败,则实现的行为就像使用了other(#include <file>)形式一样。 此外,存在第三种形式,当#include指令与上述任何一种形式都不匹配时使用。在这种形式中,对#include指令的“操作数”进行了一些基本的预处理(例如宏扩展),并且结果应该与其他两种形式中的一种匹配。 这里的一些好的答案引用了C标准,但忘记了POSIX标准,特别是c99(例如C编译器)命令的特定行为。 根据The Open Group Base Specifications Issue 7, -I 目录 在查看常用位置之前,更改用于搜索名称不是绝对路径名的标头的算法,以查找目录路径名所指定的目录。因此,名称以双引号(“”)括起来的标题应首先在#include行的文件目录中搜索,然后在-I选项中命名的目录中搜索,最后在通常的位置搜索。对于名称用尖括号(“<>”)括起来的标题,只能在-I选项中指定的目录中搜索标题,然后在通常的位置搜索标题。在-I选项中命名的目录应按指定的顺序进行搜索。c99命令调用。 因此,在符合POSIX的环境中,使用符合POSIX标准的C编译器,#include "file.h"可能会首先搜索./file.h,其中.是带有#include语句的文件所在的目录,同时#include <file.h>,可能/usr/include/file.h首先搜索,/usr/include系统定义在哪里通常的标题位置(似乎没有POSIX定义)。

C++ – 为什么在宏中使用明显无意义的do-while和if-else语句?

在许多C / C ++宏中,我看到宏的代码包含在看似无意义的do while循环中。这是一些例子。 #define FOO(X) do { f(X); g(X); } while (0) #define FOO(X) if (1) { f(X); g(X); } else 我看不出它do while在做什么。为什么不在没有它的情况下写这个? #define FOO(X) f(X); g(X) 该do ... while和if ... else在那里让这个后您的宏分号总是意味着同样的事情。假设你有类似你的第二个宏。 #define BAR(X) f(x); g(x) 现在,如果你要BAR(X);在一个if ... else语句中使用if语句的主体没有用大括号括起来,你会得到一个不好的惊喜。 if (corge) BAR(corge); else gralt(); 上面的代码将扩展为 if (corge) f(corge); g(corge); else gralt(); 这在语法上是不正确的,因为else不再与if相关联。在宏中用大括号包装东西没有帮助,因为大括号后面的分号在语法上是不正确的。 if