宏可以轻松地在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.
答案 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);}
更难以阅读。
考虑使用某些其他预处理器(如m4
或GPP)预处理源代码。这等于从其他东西生成您的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翻译特殊字符,甚至字典翻译。