#ifdef和#endif的作用
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
条件编译命令最常见的形式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef 程序段1
#denif
#ifndef和#endif的用法
#ifndef x //if not define的简写
#define x
程序段1 //如果x没有被宏定义过,定义x,并编译程序段1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。
#ifdef和#if defined的区别
#ifdef和#ifdefined的区别在于,后者可以组成复杂的预编译条件,比如:
#if defined(AAA) && defined(BBB)
xxxxxxxxx
#endif
#if defined(AAA) || VERSION>12
xxxxxxxxx
#endif
而#ifdef就不能用上面的用法,也就是说,当你要判断单个宏是否定义时#ifdef和#ifdefined效果是一样的,但是当你要判断复杂的条件时,只能用#ifdefined。
gcc -D选项
C语言源程序中有#define定义的宏,可以起到替换、条件编译的功能;定义宏的方式是放在头文件或者C文件中。gcc提供了另外一种宏定义的方法。假设程序需要很多宏,不可能这些宏都在编译器中定义,可以说比较重要的宏才会放在gcc的D选项后边。
-Dname 定义宏name,默认定义内容为字符串“1”
-Dname=defn 定义宏name,并且内容为defn
#include<stdio.h>
int main()
{
#ifdef HELLO
printf("HELLO defined !\n");
printf("HELLO = %d\n",HELLO);
#else
printf("HELLO not define!\n");
#endif
return 0;
}
#gcc main.c -o main结果 :HELLO not define!
#gcc -D HELLO main.c -o main结果 :HELLO defined!HELLO = 1
#gcc -D HELLO=36 main.c -o main结果 :HELLO defined!HELLO = 36
与#define的关系:
-D macro=string,等价于在头文件中定义:#define macro string
-D macro,等价于在头文件中定义:#define macro 1,实际上也达到了定义:#define macro的目的
gcc的参数
1、-l:用来指定程序要链接的库,-l参数紧接着就是库名。那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。
2、-L:跟着的是库文件所在的目录名。比如我们把libtest.so在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。
3、-I(大写的i):编译程序按照-I指定的路进去搜索头文件。-I/home/include/表示将-I/home/include/目录作为第一个寻找头文件的目录,寻找的顺序是: /home/include/ -->/usr/include-->/usr/local/include。
编译32位程序
运行命令:gcc -v
显示:Target: x86_64-linux-gnu
所以,gcc默认生成64位的程序。如果想编出32位的程序,就要加 -m32选项。且需要安装:
$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib