预处理器比较变量

时间:2017-05-05 23:33:41

标签: c++ preprocessor

我有一个文件A.h和B.h。

FileA.h是:

#define AA1 1

#define BB2 2

#define CC3 3

FileB.h是:

#include <FileA.h>
#define AA 1

#define BB 2

#define CC 3

#if AA != FileA.AA1 //is this the way to call AA1 variable in FileA??
#error "Mismatch variable"
#endif

如果definein fileA.h与文件FileB.h中的值不匹配,我想要编译错误。因此我添加了一个#error。 我如何在FileB.h的if语句中引用FileA.cpp中的AA1 deine?

这条线是否正确? #if AA!= FileA.AA1 我如何在#if预处理器???

中调用另一个文件中的define

2 个答案:

答案 0 :(得分:3)

你不能。 #define宏在你正在考虑它们的意义上不是成员变量。如果您希望FileA和FileB具有相似的#define s,则必须使用命名约定来区分它们。

通常,您会在#define前面加上#define FILEA_AA 125#define FILEB_AA 300标识符作为前缀。

然后您可以将它们与预处理程序指令进行比较,如下所示:

#if FILEA_AA == FILEB_AA
/* Code goes here */
#endif

答案 1 :(得分:0)

您无法使用#define执行此操作。 #define ed标识符不是变量。 #define是在编译器真正开始之前由预处理器执行的简单文本替换。

简单地说,发生的事情是这样的:某些文件包含FileB.h。这有效地将FileB.h粘贴到包含文件中,替换了include语句。此后不久,预处理器找到FileA.h的包含并执行相同的操作:在FileA.h中粘贴。最终结果如下:

#define AA 1

#define BB 2

#define CC 3

#define AA 1

#define BB 2

#define CC 3

#if AA != FileA.AA //is this the way to call AA1 variable in FileA??
#error "Mismatch variable"
#endif

重复定义。一个体面的编译器会在它们不匹配时发出警告。例如,如果我强制不匹配:

..\src\main.cpp:9:0: warning: "AA" redefined [enabled by default]
     #define AA 2
 ^
..\src\main.cpp:3:0: note: this is the location of the previous definition
     #define AA 1

我经常在警告被视为错误的情况下运行,所以我不打算继续下去。 (关于为什么我采用这种严苛的方法的旁注:编译错误意味着语法错误且代码不可执行。警告意味着代码可以执行时很可能不会按照您的意图执行。如果该程序无法正常工作,为什么还要为此而烦恼呢?)

那么我们如何解决这个问题?

我们从伟大而强大的索伦那里吸取教训,并制作一个统治者来统治他们。毕竟,如果值必须处于锁定步骤,​​为什么要重复它们?那种方式只是疯狂和错误。这种方法唯一的缺点是肮脏的霍比特人偷走了珍贵的东西。经常不会发生这种情况。

通用定义被移动到其他标头使用的标头。在此模型中,FileA.h和FileB.h都包含#include "coredefs.h",其中包含AA及其类似的所有核心定义。由于这个coredefs.h被几乎所有人都包括在内,read up on Include Guards

coredefsh。是:

#ifndef COREDEFS_H
#define COREDEFS_H

#define AA1 1

#define BB2 2

#define CC3 3

#endif

FileA.h是:

#ifndef FILEA_H
#define FILEA_H

#include "coredefs.h"

// other File A stuff here
#endif

FileB.h是:

#ifndef FILEB_H
#define FILEB_H

#include "coredefs.h"

// other File B stuff here
#endif