1

我有几个项目共享很多公共代码,但有时我需要根据项目不包含公共代码的某些部分。

我尝试创建一个名为 project_names.hh 的单独文件,其中包含以下内容:

// list of project names
#define FIRSTPROJECT 0
#define SECONDPROJECT 1

// PROJECT_NAME must be set to one of the above names in the project's main.cc file
#define PROJECT_NAME

然后在一个项目的主要文件中,我这样做:

#define PROJECT_NAME FIRSTPROJECT

问题是即使我将 project_names.hh 包含在另一个文件中,我似乎也无法编译此语句:

#if PROJECT_NAME == FIRSTPROJECT

我收到此错误:

错误:运算符“==”没有左操作数

有没有人有这样做的好方法?

谢谢!

马龙

4

5 回答 5

2

那是因为您已将PROJECT_NAME行定义为空字符串

#define PROJECT_NAME

你想把它改成

#define PROJECT_NAME FIRSTPROJECT

这需要在该项目的所有文件#include 的头文件中。

或者,您可以摆脱该项目中的所有文件,#define PROJECT_NAME而是
-DPROJECT_NAME=FIRSTPROJECT在编译器命令行上使用。请注意,如果在多个项目中使用同一个文件,则需要使用不同的选项多次编译它,并将输出放在不同的位置...

于 2012-09-06T22:40:28.240 回答
1

如果我处于您的情况,我会简单地定义 FIRSTPROJECT 或 SECONDPROJECT 而不是将 PROJECT_NAME 设置为这些值中的任何一个。然后我会用它#ifdef来检查是否设置了该值。

于 2012-09-06T22:39:50.993 回答
1

而不是#define PROJECT_NAME FIRSTPROJECT,

使用#define FIRSTPROJECT

然后检查它的存在#ifdef FIRSTPROJECT

于 2012-09-06T22:40:15.587 回答
0

这很可能是因为未设置 PROJECT_NAME。您应该检查正在编译哪个文件并检查是否在此处设置了#define。

将定义设置为整个构建过程的编译器选项可能会有所帮助。对于我知道的大多数编译器(gcc、MSVC、clang、xlC),编译器选项是

-DPROJECT_NAME=FIRSTPROJECT

于 2012-09-06T22:45:40.587 回答
0

您应该在运行#if PROJECT_NAME == FIRSTPROJECT. 预处理器可能一开始就没有加载和执行语句设置PROJCET_NAME

于 2012-09-06T22:43:33.680 回答