2012-08-08 166 views

回答

6

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

考虑:

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

定义一个宏等于运算符==

使用这个宏的代码后,你可以输入,例如:

if (EQ(2+2, 4)) 

代替:

if (2+2 == 4) 

不是很有用,真的。

6

这意味着什么:这个代码是不合格的。紧跟在#define之后的令牌必须是标识符,而,则不是。

如果要删除,,则会定义一个名称为EQfunction-like macro,它带有两个参数。

+0

是啊,我意识到,我的错字...... – ryantata 2012-08-10 08:06:51

1

让我们一步一步来

#define MAX 10 

这将通过10在你的代码文件替换单词“MAX”的每一个实例。这非常像定义一个具有一个主要区别的常量变量。 #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; 
} 

注意,与宏我们避免了二次变量的声明并没有函数调用真的,这是一般的曲icker。如果您的处理器速度较慢(或微处理器),则这一优势显而易见。

最后让我状态明显

#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; 
+0

你'#定义方(x)(x * x)'例子是避免宏的一个很好的理由。 'square(4 + 2)'的结果是什么? 36或14?并且,通过优化,像double square(double d){return d * d; }'可以内联,因此不会比宏的更慢(但更安全)。 – stefaanv 2012-08-08 09:09:35

+0

在这种情况下,您可能需要使用大量的括号:-)。我个人不喜欢宏。功能更易于保持阅读和理解,并且不易出错。对于大多数具有当今处理能力以及编译器成熟度的应用程序,我认为在许多情况下代码质量方面的成本高于优化代码的成本。 – 2012-08-08 09:43:37

相关问题