假设我有一个类似以下的文件
Mainfile.cpp
#include "stdafx.h"
#include <stdlib.h>
#include "Myfile.h"
#ifdef _MYFILE
#error Myfile.h to be included. Please refer Ream Me at C:\ReadMe
#endif
int _tmain(int argc, _TCHAR* argv[])
{
system("pause");
return 0;
}
Myfile.h
#pragma once
#undef _MYFILE
#define MYFILE
我的目标是提供其他信息(“请参阅....”),以防缺少某些内容(路径中未包含/找到MyFile.h)。
如何使用第三方库(如Boost)处理此问题?在这种情况下,我无法控制Boost
,我无法处理_MYFILE的定义:那么如何抛出错误?
Pseudo code
#include "boost/boost.h"
#if (boost is not included || directory path is not set || boost .h file not found)
#error: Set boost path and compile again
#endif
答案 0 :(得分:0)
应该不是
#if _MYFILE
#error Myfile.h to be included. Please refer Ream Me at C:\ReadMe
#endif
是
#ifndef _MYFILE
#error Myfile.h to be included. Please refer Ream Me at C:\ReadMe
#endif
答案 1 :(得分:0)
在C / C ++代码中无法做到你想要的。一旦你输入#include "myfile.h"
,编译器就可以找到该文件并在无处找到时抛出错误。
你也在滥用#ifndef ... #error ... #endif
。
有些人用它来跟踪标头依赖关系;想象你有一个标题messages.h
,它需要标题mytypes.h
。通常你只需写下这样的东西:
//文件mytypes.h
#ifndef MYTYPES_H
#define MYTYPES_H
typedef unsigned char UINT8;
// ...
#endif
// File messages.h
#ifndef MESSAGES_H
#define MESSAGES_H
#include "mytypes.h"
// ...
#endif
但你也可以这样编写messages.h:
#ifndef MESSAGES_H
#define MESSAGES_H
#ifndef MYTYPES_H
#error I need mytypes.h to compile!
#endif
#endif
但很快就会为你所依赖的所有头文件插入#errors,然后在需要头文件的所有源文件中反复包含这些依赖项。因此,在大多数情况下,第一种方法是可行的方法。
您还需要确定要使用的包含警戒的类型。如果您已经在使用#define MYFILE
,请不要#pragma once
。选择一个并坚持下去。 (并记住#pragma once
是非标准的。)
最后但并非最不重要:如果您确实需要用户友好,则需要使用构建系统来验证是否已安装所有额外的库并且其标头可用。我的猜测是你正在使用Visual Studio的本机构建器。我不知道那个,但我读过它有预构建动作所以也许可以定义一个通过一些原生的visual studio调用验证boost位置,或者只是运行项目中包含的批处理文件。