10.20-宏

在 C 语言中。宏分为两种:对象式宏和函数式宏。

对象式宏就是不带参数的宏,只是进行一些简单的替换。而函数式宏是带函数的宏,外表看上去就像是一个函数。
比如:

1
2
#define TEST "this is a test"
#define PRINT(int) printf("PRINT: %d", int)

阅读全文

3.16-左值和右值

在 C 和 C++ 中,我们经常会碰到两个概念,lvalue 和 rvalue。甚至在编译程序的时候,也会碰到一些关于 lvalue 和 rvalue 的错误。

在 ISO IEC 的标准文档中,对这两个概念并没有详细说明,特别是 rvalue,只在一个地方提了一下。
在 IBM 的 XL C/C++ V8.0 for AIX 的标准文档中是这样来规定 lvalue:

An object is a region of storage that can be examined and stored into. An lvalue is an expression that refers to such an object.

阅读全文

1.25-隐式函数声明

在 C 语言中,隐式函数声明是指函数在调用之前没有明确的声明或定义。
不同的编译器对待隐式函数声明的方式不同。在 GCC 中,编译器只会给出一个警告,但是只要不和默认函数原型冲突,编译器是不会报错的。
下面来看一个实验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// file test.c
#include <stdio.h>

int f1()
{
return f2();
}

int f2(int i)
{
return 1;
}

int main(int argc, char * argv[])
{
printf("%d\n",f1());
return 0;
}

阅读全文

4.8-引用传递的骗局

在以前的 C 教科书上,一直教导我们,C 语言函数有两种传递参数的方式:值传递和引用传递。但是,今天在看 c-faq 的 4.11 的时候,才了解到真相。其实严格意义上来讲,C 语言只有值传递,但是编译器可以模拟引用传递,但本质上,还是值传递。
举个例子:

1
2
3
4
void f(int *p);

int i;
f(&i);

阅读全文