所以我有多个级别#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
。 :/
我做错了什么?
答案 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
,只需在某个公共标题中定义它。
目前,我认为没有理由做你想做的事。无论如何,它是不容易的 - 你不应该乱用预定义的库范围的宏,因为库是使用这些定义的值编译的 - 你可以通过这种方式给自己带来一些严重的麻烦!