是否有可能(如果这样做是个好主意)有一个预处理器指令,特别是#define可以应用于整个应用程序,或者至少是多个文件?
我正在尝试在程序的多个部分中操作数组,所以我必须确保分配给它的内存仍在范围内。
为此,我决定在主要对象中声明数组,在应用程序退出之前不会删除该数组。问题是我在编译时不知道我的数组需要多大,所以我想使用#define MAX_ARRAY_SIZE 20
。
这很好,但我只想在一个地方更改最大尺寸。有没有一种好的(和安全的)方法可以做到这一点,或者我应该把它吸干并将#define放在需要它的所有文件中?
答案 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
答案 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;
}
这种方式不需要宏观方法的所有后勤工作。