我已经获得了C代码,其中标题语句包括以下内容:
#define, EQ(a, b) ((a) == (b))
这是什么意思?
它没有任何意义:这段代码格式不正确。紧跟在 a 之后的标记#define
必须是标识符,但,
不是。
如果,
要删除 ,这将定义一个名为的类函数宏EQ
,该宏需要两个参数。
逗号是一个错误,会阻止代码编译:我假设它是一个错字。
鉴于:
#define EQ(a, b) ((a) == (b))
这为相等运算符定义了一个宏==
。
稍后在代码中使用此宏,您可以键入,例如:
if (EQ(2+2, 4))
代替:
if (2+2 == 4)
不是很有用,真的。
让我们一步一步来
#define MAX 10
这会将代码文件中单词“MAX”的每个实例替换为 10。这非常类似于定义一个具有一个主要区别的常量变量。#define 语句的解释在编译之前完成。这有助于例如使用 MAX 作为数组大小。如果您改用变量,这在许多情况下会导致编译器错误。
您可以cpp <filename.c>
在 Linux 终端中使用命令来查看执行宏时会发生什么。
例如这段代码:
#define MAX 10
int numbers[MAX];
预处理后(即预处理器宏的解释)
int numbers[10];
请注意,#define 语句将在解释后消失。
这将我们带到另一个例子
#define square(x) (x * x)
我们代码中的每个实例square(x)
不仅会被替换,(x * x)
而且 x 的值也会被替换。其效果类似于功能减速,但又有所不同
所以
square(5)
将被替换为(5 * 5)
最后我们的例子
#define, EQ(a, b) ((a) == (b))
这将替换EQ(a, b)
by((a) == (b))
举个例子
EQ(4, 5)
将被替换为((4) == (5))
现在“==”是什么意思?如果 4 和 5 相等,则“检查是否相等”整个表达式将评估为 1(这显然不是真的),因此该表达式最终将被评估为 0。
哪个或多或少喜欢这个功能的效果
int EQ(int a, int b)
{
return (a == b);
}
也可以写成
int EQ(int a, int b)
{
if (a ==b) return 1;
if (a !=b) return 0;
}
请注意,使用宏我们避免了两个变量声明,并且实际上没有函数调用,而且通常更快。如果您有较慢的处理器(或微处理器),这一优势将是显而易见的。
最后让我说明显而易见的
#define simple_macro 5
int some_integer_variable = 10;
.
.
.
some_integer_variable = simple_macro;
simple_macro = 12; /* illegal statement */
simple_macro++; /* illegal statement */
因为在运行预处理器之后,这将是
int some_integer_variable = 10;
.
.
.
some_integer_variable = 5;
5 = 12;
5 ++;
哦!我可能说得太多了,但让我把这个(明显的)代码留给你
#define MAX 10
int variable = MAX; /*this is a MAX variable */
char some_string[] = "the MAX value"; /* no replacement will happen here */
int variable_MAX; /* no replacement will happen here */
运行预处理器后将
int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;