Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C preprocessor 对C以外的语言使用C预处理器_C Preprocessor - Fatal编程技术网

C preprocessor 对C以外的语言使用C预处理器

C preprocessor 对C以外的语言使用C预处理器,c-preprocessor,C Preprocessor,各州的维基百科条目: 预处理器语言 指令对语法是不可知的 的C,因此C预处理器也可以 可独立用于处理其他文件 文件类型 如何做到这一点?有什么例子或技巧吗 编辑:是的,我主要对宏处理感兴趣。尽管它可能不可取或不可维护,但了解可能的情况仍然很有用。您可以在另一种语言的编译器中实现C预处理器 您可以使用它来预处理任何类型的文本文件,但有更好的方法可以实现这一目的。通常您可以调用C编译器,并选择仅预处理(并忽略任何#line语句)。举个简单的例子: <?php function foo() {

各州的维基百科条目:

预处理器语言 指令对语法是不可知的 的C,因此C预处理器也可以 可独立用于处理其他文件 文件类型

如何做到这一点?有什么例子或技巧吗


编辑:是的,我主要对宏处理感兴趣。尽管它可能不可取或不可维护,但了解可能的情况仍然很有用。

您可以在另一种语言的编译器中实现C预处理器


您可以使用它来预处理任何类型的文本文件,但有更好的方法可以实现这一目的。

通常您可以调用C编译器,并选择仅预处理(并忽略任何#line语句)。举个简单的例子:

<?php
function foo()
{
#ifdef DEBUG
    echo "Some debug info.";
#endif
    echo "Foo!";
}

foo();
由于未定义
DEBUG
,因此第一个
echo
被剥离。另外,以#开头的行是PHP中的注释,因此您不必为“调试”构建预处理它们


编辑:因为你问过宏。这也很好,可以用来生成样板代码等。

许多C编译器都有一个标志,告诉它们只进行预处理。对于gcc,它是-E标志。例如:

$ gcc -E -                 
#define FOO foo
bar FOO baz
将输出:

# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"

bar foo baz
#1“
# 1 ""
# 1 ""
# 1 ""
巴富巴

对于其他C编译器,您必须查看手册,了解如何将C转换为仅预处理模式。

基本上,它说的是预处理器与C语法无关。它们基本上是遵循一组规则的简单解析器。因此,您可以使用预处理器,就像您将sed或awk用于一些愚蠢的任务一样。别问我你为什么要这么做

例如,在文本文件上:

#define pi 3.141

pi is not an irrational number.
然后你运行预处理器&你会得到

3.141不是无理数


例如,汇编程序。虽然许多汇编器都有自己的方法来#包含头和#定义宏,但使用C预处理器可以实现这一点。例如,GNU make在将*.S文件提供给GNU汇编程序(“as”)之前,通过运行预处理器(“cpp”)将*.S文件转换为*.S文件,具有隐式规则。

使用Microsoft的编译器,我认为(我只是查找了它,还没有测试过它)它是最好的


其他编译器可能有类似的选项(或者,对于某些编译器,预处理器实际上可能是不同的可执行文件,通常由编译器隐式运行,但也可以显式单独运行)。

假设您使用的是GCC,则您可以获取任何纯文本文件,而不管其内容如何,然后运行:

gcc -E filename gcc-E文件名 文件中的任何预处理器指令都将由预处理器处理,然后GCC将退出


关键是,文本文件的实际内容是什么并不重要,因为预处理器只关心自己的指令。

是的,可以通过gcc预处理器(例如“gcc-e”)解析自己的语言

我们在我的工作中用我们的特定语言做到了这一点。它有很多优点:

  • 您可以使用C的include语句(#include),它非常强大
  • 您可以使用#ifdef结构
  • 您可以定义常量(#定义魔数42)或宏函数(#定义最小值(x,y)((x(<(y)?(x):(y))
…以及c处理器中的其他东西

但是,您也继承了不安全的C结构,并且预处理器未与主语言集成是其原因。考虑最小宏并执行以下操作:

a = 2;
b = 3;

c = min(a--, b--);
试想一下,在min函数之后,a和b的值是多少

您引入的非类型常量也是如此


有关详细信息,请参阅本书。

我听说有人在Ada代码上使用C预处理器。因此,如果要对代码进行预处理,必须这样做


然而,这是一个简洁的设计决定,不给它一个,所以这样做是非常不符合Ada的。我不建议任何人这样做。

不久前,我在一个项目上做了一些工作,该项目使用
imake
生成make文件。我记得,生成make文件基本上是使用c预处理器语法。

您可以直接调用CPP:

cpp <file>
但是,请注意,正如同一篇Wikipedia文章中提到的,C预处理器的语言并不是真正用于通用的:

但是,由于C预处理器没有其他一些特性 预处理器,如递归宏,根据 引用、条件中的字符串求值和图灵 完整性,与更一般的宏相比,它非常有限 处理器,如m4


您是否考虑过使用更灵活的宏处理语言,例如前面提到的m4?

C预处理器也可以由(GHC)调用在编译Haskell代码之前,通过传递标志。

你需要对预处理器做什么?如果你只需要宏处理,你可以使用m4:woah,m4?我是说..说真的吗?我认为这对大多数人来说是一件很容易忘记的事情。现在在哪里使用它?我知道的一件事是,它被用来编译sendmail的.cf files.m4当您运行configure;make;make install时,可能仍然会使用它。请仔细查看configure。我对m4的第一个介绍是,它用于为gEDA设计软件进行电子设备电路板封装设计。我认为它仍然在该套件中使用(IMHO是最好的套件之一,并且是可启动的开源套件)@dwhall我昨天听从了您和其他人的建议,使用M4为我正在进行的项目实现了GL ES/金属混合着色器。在整个过程中,我实现了两个方面:1.我以前使用过M4(用于Sendmail)我讨厌它;2.与更简单和广泛使用的工具(如C预处理器)和现代更健壮的工具(如
cpp <file>
gcc -E filename