夜礼服 发表于 2016-3-4 10:28:09

条件编译的用法

假设:我们的工程中有如下三个文件:a.h,b.h和c.cpp,其中b文件包含了a.h,c文件中又分別包含了a.h和b.h如下:

FiIe:a.h
#include<iostream>
void Function_1()
{
   //do something
}

File:b.h
#include“a.h”
void Function_2(int c)
{
    //using Function;
}

File:c.pp
#include“a.h”
#include“b.h”
int main()

    //
    return 0;

在编译的时候会出现“multiple definition of”错误,原因在于a.h被包含了两次,求用#ifndef#define#endif将此程序修改后的具体代码。

n0noper 发表于 2016-3-4 10:28:10

夜礼服 发表于 2016-3-4 14:02
是不是可以这样说:#ifndef与#include的位置沒有关系,只是预处理时就可以解决文件重复包含的问题。

yeah, i think so.

你可以多测试一下,反正我用了这么久没遇到过问题。

jzh823 发表于 2016-3-4 10:50:16

只包含 b.h 就可以了,因为b.h包含了 a.h

n0noper 发表于 2016-3-4 11:02:10

楼主你好, 好多种写法,具体那种才是规范就不知道了:
#ifndef a_h    // 这里好多种写法,比如_A_H_    A_H_
#define        a_h
#endif

夜礼服 发表于 2016-3-4 11:21:56

n0noper 发表于 2016-3-4 11:02
楼主你好, 好多种写法,具体那种才是规范就不知道了:

那么#include"b.h"该插入到代码的哪个位置呢?令外#define的作用是不是包含头文件呢?

n0noper 发表于 2016-3-4 12:04:31

夜礼服 发表于 2016-3-4 11:21
那么#include"b.h"该插入到代码的哪个位置呢?令外#define的作用是不是包含头文件呢?

位置没要求吧。另外,#include "a.h"替换#define 是否可以?可以尝试。

夜礼服 发表于 2016-3-4 12:28:26

位置如果放在#endif后,那么a.h岂不是会又被包含一次吗?

n0noper 发表于 2016-3-4 13:12:07

夜礼服 发表于 2016-3-4 12:28
位置如果放在#endif后,那么a.h岂不是会又被包含一次吗?

根据#代表的"预处理"这个名字可以看出,链接之前就已经处理了,所以不会重复包含。

另外,上边那个我试了一下,不能#include来替换,只能#define{:10_269:}

夜礼服 发表于 2016-3-4 14:02:13

n0noper 发表于 2016-3-4 13:12
根据#代表的"预处理"这个名字可以看出,链接之前就已经处理了,所以不会重复包含。

另外,上边那个我 ...

是不是可以这样说:#ifndef与#include的位置沒有关系,只是预处理时就可以解决文件重复包含的问题。

夜礼服 发表于 2016-3-4 14:46:01

n0noper 发表于 2016-3-4 14:26
yeah, i think so.

你可以多测试一下,反正我用了这么久没遇到过问题。

谢谢喽
页: [1]
查看完整版本: 条件编译的用法