C ++预编译器有条件地包含代码

时间:2012-09-06 22:35:10

标签: preprocessor

我有一些共享许多常用代码的项目,但有时我需要根据项目不包含公共代码的某些部分。

我尝试创建一个名为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

我收到此错误:

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

有没有人有这么好的方法呢?

谢谢!

马龙

5 个答案:

答案 0 :(得分:2)

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

#define PROJECT_NAME

您想将其更改为

#define PROJECT_NAME FIRSTPROJECT

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

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

答案 1 :(得分:0)

如果我处于你的情况,我只需定义FIRSTPROJECT或SECONDPROJECT,而不是将PROJECT_NAME设置为其中任何一个值。然后我会使用#ifdef来检查是否设置了该值。

答案 2 :(得分:0)

而不是#define PROJECT_NAME FIRSTPROJECT

使用#define FIRSTPROJECT

然后用#ifdef FIRSTPROJECT

检查它的存在

答案 3 :(得分:0)

您应该在运行#if PROJECT_NAME == FIRSTPROJECT的文件中包含project_names.hh。预处理器可能没有首先加载并执行语句设置PROJCET_NAME

答案 4 :(得分:0)

这很可能是因为没有设置PROJECT_NAME。您应该检查正在编译的文件,并检查是否在那里设置了#define。

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

-DPROJECT_NAME=FIRSTPROJECT