1

假设我有一个如下文件

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
4

2 回答 2

0

用 C/C++ 代码做你想做的事是不可能的。一旦你输入#include "myfile.h",编译器就可以找到那个文件,如果找不到它就会抛出错误。

你也在滥用#ifndef ... #error ... #endif. 有些人用它来跟踪头依赖;想象一下你有一个messages.h需要 header 的 header mytypes.h。通常你只需要这样写:

// 文件 mytypes.h

#ifndef MYTYPES_H
#define MYTYPES_H

typedef unsigned char UINT8;
// ...

#endif

// 文件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 调用或简单地通过运行项目中包含的批处理文件来验证提升位置的操作。

于 2013-09-19T14:21:26.937 回答
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
于 2013-09-19T12:36:08.690 回答