我有一个文件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答案 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