#define 在 C 中使用 if-else 逻辑

#define with if-else logic in C

我正在根据 Beej's Guide to Network Programming 模拟 client/server 交互。在我的 server.c 文件的开头,我定义了一个端口号:

#define PORT "21124"

但是,我将从该文件创建多个服务器,并且我想根据一些 if-else 逻辑更改此常量。 C 中是否有一个功能可以轻松完成此操作,例如:

if (serverNumber == 1) {
  #define PORT "21124"
}
else if (serverNumber == 2) {
  #define PORT "12412"
}
else {
  #define PORT "12334"
}

这可能是重复的,但我没有在搜索中看到它。我是 C 菜鸟。

"I would like to change this constant"。听起来不太对吧?

因此,只需使用像 int port 这样的变量,并使用简单的 if-else 语句块或开关为其赋值。

您不应以这种方式使用 #define。使用 #if#elif#else 的预处理器存在 if-else 逻辑,但您必须意识到这实际上是对应用程序进行硬编码。

你可以这样做,但我也不推荐这样做。只需使用变量或 const 代替,因为类型安全性更好——不需要预处理器:

#define PORT_1   "21124"
#define PORT_2   "12412"
#define PORT_3   "12334"

if (serverNumber == 1) {
    port = PORT_1;
}
else if (serverNumber == 2) {
    port = PORT_2;
}
else {
    port = PORT_3;
}

你不能做正在尝试的事情。

#define 语句在编译时处理。根据 运行 时间的变量值使用不同的 #define 语句没有意义。

你能做的最好的是:

#define PORT_1 "21124"
#define PORT_2 "12412"
#define PORT_3 "12334"

使用变量 PORT 并适当地设置它的值。

if (serverNumber == 1) {
  PORT = PORT_1;
}
else if (serverNumber == 2) {
  PORT = PORT_2;
}
else {
  PORT = PORT_3;
}

#define 语句是对 C 预处理器的指令。所以在 if 语句中定义它们是行不通的。你可以做的是这样的:

#define ServerNumber 1
#if ServerNumber == 1
#define PORT 1234
#elif ServerNumber == 2
#define PORT 1235
#endif

或者,跳过一起使用 #define 并将此端口号指定为命令行选项。