重新定义#define -d值

时间:2017-03-14 21:15:08

标签: c++ preprocessor-directive

所以我有多个级别#include正在进行,最终看起来像这样:

MyHeader.h:

...
#include WindowsPlatform.h
...
void MyFunc()
{
    printf("File path max length: %d", PLATFORM_MAX_FILEPATH_LENGTH);
    return;
}

WindowsPlatform.h

#include minwindef.h
...
#define PLATFORM_MAX_FILEPATH_LENGTH                        MAX_PATH
...

minwindef.h

...
#define MAX_PATH          260
...

请注意,我不控制这些标题,除了我自己的标题。

我试图覆盖MAX_PATH定义,显然是通过看起来像-DMAX_PATH=1024的命令行参数(它是自动构建工具的一部分)。

但是,我放在那里的东西似乎没有覆盖文件中的#define。 :/

我做错了什么?

3 个答案:

答案 0 :(得分:2)

最好的修复方法可能是修改头文件。尝试:

#ifndef MAX_PATH
#define MAX_PATH          260
#endif

如果这不起作用,则需要更极端的东西,例如:

#ifdef OVERRIDE_MAX_PATH
#define MAX_PATH OVERRIDE_MAX_PATH
#else
#define MAX_PATH          260
#endif

并使用-DOVERRIDE_MAX_PATH=1024

答案 1 :(得分:2)

C和C ++语言规范都是刻意设计的,可以安静地允许匹配"宏重新定义和抱怨宏观重新定义冲突。在C和C ++中,冲突的宏定义是"错误" (格式不正确,违反约束 - 选择你的条款)。这意味着您尝试将宏重新定义为不同的值通常会触发诊断消息。

如果您的编译器没有抱怨,那么您的冲突定义永远不会相互见面,或者您正在做其他错误的操作。无论如何,它不会那样工作。

答案 2 :(得分:1)

看起来您尝试编写一些与操作系统无关的代码。如果我理解正确并且WindowsPlatform.h是特定于Windows的(因此你已经有了一个抽象层) - 你为什么要重写任何东西呢?

为什么这样做:

#define PLATFORM_MAX_FILEPATH_LENGTH MAX_PATH

并尝试搞乱标准定义?为什么不这样:

#define PLATFORM_MAX_FILEPATH_LENGTH 1024

如果在平台相关标头中定义了PLATFORM_MAX_FILEPATH_LENGTH,则可以为每个平台定义不同的值。如果始终希望它为1024,只需在某个公共标题中定义它。

目前,我认为没有理由做你想做的事。无论如何,它是不容易的 - 你不应该乱用预定义的库范围的宏,因为库是使用这些定义的值编译的 - 你可以通过这种方式给自己带来一些严重的麻烦!