【问题标题】:Preprocessor examples in C languageC语言预处理器示例
【发布时间】:2009-08-31 02:24:27
【问题描述】:

我想要一些 C 预处理器指令的例子,例如:

#define pi 3.14
#define MAX 100

我只知道这一点。 我想了解更多,更多关于预处理器指令的信息。

【问题讨论】:

  • 你的 pi 非常不准确。你可能想从 math.h 中提取 M_PI。
  • 这个版本的 pi 比大约 100 年前在印第安纳州(不是堪萨斯州)几乎通过法律的版本要准确得多:straightdope.com/columns/read/805/…
  • 关于术语的注释,您所说的“预处理器”更正确地称为“预处理器指令”。术语“预处理器”是指解释预处理器指令并相应地修改源文件的程序。

标签: c++ c


【解决方案1】:

最大的例子是

 #include<stdio.h>

但有相当数量。您还可以定义宏:

 #define MAX(X,Y) (((X) > (Y)) ? (X) : (Y))

并使用header guards

#ifndef A_H
#define A_H

// code

#endif

编译器定义了一些专有的扩展来让你给出处理指令:

#ifdef WIN32 // WIN32 is defined by all Windows 32 compilers, but not by others.
#include <windows.h>
#else
#include <unistd.h>
#endif

if 语句的原因也可用于注释:

#if 0

int notrealcode = 0;

#endif

我经常使用预处理器进行调试构建:

#ifdef EBUG
printf("Debug Info");
#endif

$ gcc -DEBUG file.c //debug build
$ gcc file.c //normal build

正如其他人所指出的,有很多地方可以获取更多信息:

【讨论】:

  • 始终用括号保护宏扩展中的所有参数。考虑'MAX(x|3, y&amp;4)'的扩展;如果没有将 '(X > Y)' 括起来为 '((X) > (Y))',它的计算结果不会达到您的预期。
  • 您的标头保护名称是非法的。
  • Neil 所指的是,在 C(和 C++)中,以下划线和大写字母开头的标识符保留供操作系统和语言实现的其他元素使用。
  • @Tyler:不。它们保留给实现使用——系统库和编译器。换句话说,它们是为 for 头文件保留的,例如 /usr/include/linux 下的头文件。这就是重点。这些标头是系统标头,允许使用特殊类别的名称,以便它们可以避免与 your 代码的命名冲突。因此,如果你的代码开始使用他们的名字,整个系统就会崩溃,你就有发生冲突的风险。
  • @Tyler 该标准在保留名称方面未提及操作系统,仅提及语言实现。如果您引用的文件是特定 C 或 C++ 实现的一部分,那么它们是合法的。如果它们来自其他地方,就像一大堆 POSIX 标头一样,例如,那么它们不是。可悲的是,那里没有什么新东西。
【解决方案2】:

您是否完全熟悉基础知识,例如如wikipedia 所述?或者你需要一个初级教程?还是什么?

【讨论】:

    【解决方案3】:

    也许是其中之一

    可以帮上忙。

    【讨论】:

      【解决方案4】:

      除了#define 之外,处理器还有很多其他功能。不要忘记#include 和条件编译。

      http://en.wikipedia.org/wiki/C_preprocessor

      【讨论】:

        【解决方案5】:

        最重要的一个:

        #ifndef THIS_HEADER_H
        #define THIS_HEADER_H
        
        // Declarations go here    
        
        #endif //THIS_HEADER_H
        

        这样可以防止头文件多次包含在单个 C 文件中。

        对于 gcc 源,我喜欢使用__LINE__,如:

        printf("%s: %d: Some debug info\n", __func__, __LINE__);
        

        用于调试目的。

        【讨论】:

        • 除非您正在编写编译器,否则应避免定义以“_”开头的符号。
        • 是的。我将其修复为更通用。
        【解决方案6】:

        如果条件失败,这将停止编译。

        #define WIDTH 10
        #define HEIGHT 20
        
        #if WIDTH < HEIGHT
        #    error "WIDTH must be greater than or equal to HEIGHT"
        #endif
        

        C 预处理器手册页 http://gcc.gnu.org/onlinedocs/cpp/index.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 2013-06-13
          • 1970-01-01
          • 2021-12-04
          • 2012-04-25
          • 2016-09-16
          • 2019-06-28
          相关资源
          最近更新 更多