C宏可以更改宏关键字

时间:2016-08-05 08:37:08

标签: c macros

宏可以轻松地在C中为关键字设置别名,但也可以用它来更改宏关键字,所以代替:

#include <stdlib.h>

#define se if

一个人可以写

#inkludu <stdlib.h>

#difinu se if

换句话说,预处理指令可以别名,最好是代码本身,例如使用编译器参数,例如gcc的-D

如下所示的简单测试将失败:

#define difinu define
#difinu valoro 2

int main() {
    int aĵo = valoro;
    return 0;
}

出现以下错误:

 % clang makro.c -o makro
makro.c:2:2: error: invalid preprocessing directive
#difinu valoro 2
 ^
makro.c:5:16: error: use of undeclared identifier 'valoro'
    int aĵo = valoro;
              ^
2 errors generated.

4 个答案:

答案 0 :(得分:6)

没有。宏不会改变处理预处理程序指令的方式(但当然可以根据#if等条件指令进行更改。特别是,以下是错误的

///WRONG CODE
#define inc include
/// the following directive is not recognized as an include
#inc <stdio.h>

BTW,

#define se if
即使有可能,

也是一个坏习惯。它使您的代码se (x>0) {printf("negative x=%d\n", x);}更难以阅读。

考虑使用某些其他预处理器(如m4GPP)预处理源代码。这等于从其他东西生成您的C(或C ++)代码。

我的感觉是metaprogramming通常是一个好主意:你写了一些专门的程序,例如发出C或C ++代码(并且相应地改进了构建过程,例如your Makefile)。但是你可能会设计一个真正的C或C ++代码生成器(可以处理和处理某种AST)。像[{3}}或compiler-compilers这样的解析器生成器(错误地称为ANTLR)就是一个很好的例子。并bison

另见Qt has moc&amp; this回答相关问题。

在尝试使用自己的代码生成器(或域特定语言实现)之前,不要忘记阅读几本教科书(特别是与编译器相关)。

答案 1 :(得分:2)

在历史记录中,请注意,是的,有些时候有一些编译器可以重新定义宏定义,并且这个事实的证据是IOCCC 1985的以下条目,显然很好地编写了一个Vax那时候是780 / 4.2BSD:

http://ioccc.org/1985/lycklama/lycklama.c

以:

开头
#define o define
#o ___o write
#o ooo (unsigned)

答案 2 :(得分:0)

&#34;#定义&#34;是用于编译/编译&#34;的MACRO替换(文本替换)的预处理器的关键字。考虑c中的代码编译阶段,预处理器 - &gt;编译器 - &gt;汇编程序 - &gt;链接器 - &gt;加载器&#39; ..

所以,当你编译这段代码时,预处理器试图搜索关键字&#34; #difinu&#34;这不存在。所以你从预处理器阶段本身得到错误。

此外&#34; #define&#34;是单个关键字,你怎么能指望预处理器将其视为&#34;#&#34; +&#34;定义&#34; 。例如

#define game olympic 
main (){
 int abcgame =10;// will it become "abcolympic" ??
 return;
}

答案 3 :(得分:0)

确实存在本地化语言。 Algol68(在Linux下可用)是一种非常古老的语言(1968年),顺便说一句,它是现存的优秀语言之一:

IF x < y THEN x ELSE y FI := 3;
( x < y | x | y ) := 3;
IF x < y THEN sin ELSE cos FI(3.14)

在你的情况下,我会写一个额外的预处理器说.eocpp和.eohpp说.cpp和.hpp。这可以x翻译特殊字符,甚至字典翻译。