我的问题很简单。我只是想知道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
方法。
答案 0 :(得分:1)
你做不到。每个C ++源文件都是独立编译的,一个中的设置不会影响另一个。您必须在项目级别执行此操作。
执行此操作的一种方法是为此宏的不同值设置不同的项目(和解决方案)配置。您可以添加Debug
,Release
等,而不仅仅是通常的Debug-Display
和Debug-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