#define,EQ(a,b)((a)==(b))是什么意思?

时间:2012-08-08 03:42:28

标签: c c-preprocessor

我已经给出了 C 代码,其中heading语句包含以下内容:

#define, EQ(a, b) ((a) == (b))

这是什么意思?

3 个答案:

答案 0 :(得分:6)

它没有任何意义:此代码格式错误。紧跟在#define之后的令牌必须是,不是的标识符。

如果要移除,,则会定义一个名为EQ的{​​{3}},其中包含两个参数。

答案 1 :(得分:6)

逗号是一个错误,会阻止代码编译:我会认为这是一个错字。

假设:

#define EQ(a, b) ((a) == (b))

这为等于运算符==定义了一个宏。

稍后在代码中使用此宏,您可以键入,例如:

if (EQ(2+2, 4))

而不是:

if (2+2 == 4)

真的不是很有用。

答案 2 :(得分:1)

让我们一步一步来看

#define MAX 10

这将在您的代码文件中将“MAX”字的每个实例替换为10。这非常类似于定义具有一个主要差异的常量变量。 #define语句的解释在编译之前完成。这有助于一个例子使用MAX作为数组大小。如果您使用了变量,那么在许多情况下会导致编译器错误。

您可以在Linux终端中使用cpp <filename.c>命令查看执行宏时会发生什么。

这个代码的例子:

#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)

替换((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;