如何在不同的项目中控制#define指令......?

时间:2015-08-19 13:34:48

标签: c++ visual-c++

我的问题很简单。我只是想知道C ++中的#define指令是否可以控制不同的项目文件?精心设计,我有一个头文件和一个项目的cpp文件。文件代码如下:

  

MyHeader.h

#ifndef __MY_HEADER_H__

#include <cstring>
using namespace std;

#ifdef _HEADER_EXPORT_
#define HEADER_API __declspec(dllexport)
#else
#define HEADER_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

class HEADER_API MyHeader
{
public:
    MyHeader();
    ~MyHeader();
#ifdef _HEADER_DISPLAY_
    void __cdecl ParseHeader();
#elif defined (_HEADER_RETURN_)
    string __cdecl ParseHeader();
#endif
};

#ifdef __cplusplus
}
#endif

#define __MY_HEADER_H__
#endif
  

MyHeader.cpp

#ifndef __MY_HEADER_H__
#include "MyHeader.h"
#endif

MyHeader::MyHeader() { }
MyHeader::~MyHeader() { }

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _HEADER_DISPLAY_
    HEADER_API void __cdecl MyHeader::ParseHeader()
    {
        fputs(string("Displaying...").c_str(), stdout);
    }
#elif defined (_HEADER_RETURN_)
    HEADER_API string __cdecl MyHeader::ParseHeader()
    {
        string retVal("Returning...");
        return retVal;
    }
#endif

#ifdef __cplusplus
}
#endif

在另一个项目中, HeaderImpl.cpp 文件已使用以下代码实现。

  

HeaderImpl.cpp

#include "stdafx.h"

#define _HEADER_DISPLAY_ // To display the message

// #define _HEADER_RETURN_ // To return the message as string
#include "MyHeader.h"

int main(int argc, char* argv[])
{
    MyHeader header;
    MyHeader.ParseHeader(); // To display the message or to return the string
    return 0;
}

现在,我想知道如何在#define文件中使用HeaderImpl.cpp指令来控制ParseHeader文件的MyHeader.cpp方法?正如已经注意到MyHeader.h文件完全符合我的需要;即相应地在声明ParseHeader指令时控制#define方法。

3 个答案:

答案 0 :(得分:1)

你做不到。每个C ++源文件都是独立编译的,一个中的设置不会影响另一个。您必须在项目级别执行此操作。

执行此操作的一种方法是为此宏的不同值设置不同的项目(和解决方案)配置。您可以添加DebugRelease等,而不仅仅是通常的Debug-DisplayDebug-Return。然后,您可以在项目设置中为每个配置定义宏。这将确保您链接正确构建的库版本。

作为旁注,您在代码中使用了非法名称。包含双下划线的名称,或以下划线后跟大写字母开头的名称,保留给编译器&amp;标准库。用户代码不得出于自身目的使用此类名称。

答案 1 :(得分:0)

您通常可以在编译器的命令行上为所有编译单元提供#defines。适用于Visual Studio的IIRC,类似/D_HEADER_DISPLAY_/D_HEADER_RETURN_

您的项目必须已经使用_HEADER_EXPORT_ define。

这样的内容

答案 2 :(得分:0)

一个翻译单元中的预处理器定义无法远程影响不同的翻译单元。

大多数(如果不是全部)编译器都接受它们作为编译的参数(并且标志通常是-D,或者/D用于VC ++)。

在Visual Studio中,您可以在项目设置中的

下设置项目范围的预处理器定义
Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions