【发布时间】:2020-11-14 03:59:56
【问题描述】:
我有两个 C++ 文件 main.cpp 和 client.cpp,还有一个头文件 action.h。我正在尝试使用预处理器指令来模拟一个简单的客户端-服务器场景。代码如下:
//main.cpp
#include "action.h"
extern void connect();
static Action server;
int main()
{
server.init();
connect();
server.execute();
return 0;
}
//client.cpp
#define CLIENT
#include "action.h"
void connect()
{
Action client;
client.init();
client.execute();
}
还有头文件。
#include <iostream>
struct Action
{
#ifdef CLIENT
int data = 10;
#else
int data = 13;
#endif
inline void init()
{
#ifdef CLIENT
std::cout << "Client " << data << std::endl;
data = -1;
#else
std::cout << "Server " << data << std::endl;
data = 0;
#endif
}
inline void execute()
{
#ifdef CLIENT
std::cout << "Server is " << data << std::endl;
#else
std::cout << "Number of clients is " << data << std::endl;
#endif
}
};
当我运行它时,我得到以下结果:
服务器 13
服务器 10
客户端数量为0
客户端数量为0
现在我的问题是为什么#ifdef CLIENT 块在action.h (int data = 10) 的声明部分执行,而#else 块在init() 和execute() 函数内执行,当我从@ 调用它们时987654334@文件?为什么不是所有三个调用都转到#ifdef 部分?
【问题讨论】:
-
您的程序表现出未定义的行为,违反了One Definition Rule
-
类
Action有两个不同的定义违反了一个定义规则。程序的行为未定义。
标签: c++ preprocessor-directive