#define整个程序

时间:2014-07-22 10:23:08

标签: c++ preprocessor-directive

是否有可能(如果这样做是个好主意)有一个预处理器指令,特别是#define可以应用于整个应用程序,或者至少是多个文件?

我正在尝试在程序的多个部分中操作数组,所以我必须确保分配给它的内存仍在范围内。

为此,我决定在主要对象中声明数组,在应用程序退出之前不会删除该数组。问题是我在编译时不知道我的数组需要多大,所以我想使用#define MAX_ARRAY_SIZE 20

这很好,但我只想在一个地方更改最大尺寸。有没有一种好的(和安全的)方法可以做到这一点,或者我应该把它吸干并将#define放在需要它的所有文件中?

6 个答案:

答案 0 :(得分:2)

创建一个全局标头文件并使用header-guard。在每个headerfiles / * .c / * .cpp文件中包含此全局标头后,您将拥有本地代码可用的宏。如果您不想在标题中使用宏,我会在您的实现文件中包含全局标题...这也是我建议的。

示例:

global.h:

#ifndef GLOBAL_H
#define GLOBAL_H
#define MYCONSTANT 0xFF
#endif

儿童文件:

#ifndef GLOBAL_H
#include "global.h"
#endif

也不要忘记使用

#pragma once

if your compiler supports it

答案 1 :(得分:2)

如果使用gcc / g ++或兼容工具,可以将其添加为编译器指令,例如在makefile中。

g++ ... -DMAX_ARRAY_SIZE=20 ...

这是整个构建中#define的常用方法,它使得更改非常孤立,这很不错。

答案 2 :(得分:1)

在多个文件中使用#define是很好的。您可以使用共享的头文件执行此操作。但是,这听起来不会解决您的问题。

如果在编译时不知道数组的大小,这将无济于事 - 因为#define只能在编译时工作。

您可以简单地将数组的大小作为另一个变量,并使用new动态分配数组并使用delete []删除它。或者只使用std:vector。

答案 3 :(得分:1)

这通常由构建工具链处理,而不是在代码中处理。将#define应用于整个程序非常困难,特别是当该程序很大时。

如果您正在使用cmake创建makefile,则可以执行cmake ... -DMAX_ARRAY_SIZE=20。在linux下使用gcc,这最终会变成g++ ... -DMAX_ARRAY_SIZE=20,如果你手工构建而不是使用makefile,你也可以这样做。

另一方面,这对宏IMO来说并不是很有用。围绕C ++类型系统的宏,很难调试和保持,通常应该避免,除非你别无选择。有些时候你别无选择 - 但这不是其中之一。而不是宏,使用一个真正的变量:

static const size_t MaxArraySize = 20;

这应该包含在您想要使用它的任何位置的标题中。只有一个地方存在此声明。

答案 4 :(得分:0)

是的!将其声明为MACRO或仅作为头文件中的gobal变量。 确保在您使用/修改的位置包含此头文件。

如果您还想要修改它,那么全局变量是处理它的最简单方法。 也可以使用MACRO

完成

只需使用:

undef MAX_ARRAY_SIZE

定义MAX_ARRAY_SIZE 100

答案 5 :(得分:-1)

这里有几个选项。经典的方法是将#define移动到头文件,并将其包含在任何相关的源文件中。

更好的方法可能就是:

template <class T, int maxSize = 20>
class myClass
{
    T myArr[maxSize];
    ...
};

int main()
{
    myClass<int> x;
    return 0;
}

这种方式不需要宏观方法的所有后勤工作。