2015-04-05 88 views
-1

我正在根據Beej's Guide to Network Programming模擬客戶端/服務器交互。在我server.c文件的開頭,我定義一個與端口號:#在if中定義if-else邏輯

#define PORT "21124" 

不過,我會從這個文件中創建多個服務器和我想改變基於一些if-else邏輯這個常數。在C中有沒有一個功能可以輕鬆實現這一點,如:

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

這可能是重複的,但我沒有在搜索中看到它。我是C noob。

+0

聽起來不像是這個東西是一個常量。你可能不應該''定義'它。 – user2357112 2015-04-05 02:42:19

+0

你要麼'#if'(不是'if')或者你不想'#define'。可能是後者。 – Leushenko 2015-04-05 02:43:15

+0

我知道這個問題可能並不適用最佳做法,但是,我不明白爲什麼它會被低估。如果有的話,它可以用來通知將來可能會犯同樣錯誤的人。無論如何,我完全同意每個人的觀點。謝謝你們。 – 2015-04-05 02:50:05

回答

2

您不應該以這種方式使用#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; 
} 
3

「我想改變這個常數」。這聽起來不對,是嗎?

所以,只需使用一個像int port這樣的變量,並用一個簡單的if-else語句塊或者一個開關來賦值。

2

你不能做什麼努力。

#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; 
} 
2

#define語句是對C預處理器的指令。因此在if語句中定義它們將不起作用。你可以做的是這樣的:

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

另外,跳過使用#define一起,並指定爲命令行選項,此端口號。