2013-11-28 60 views
1

我想轉換一個自定義的字符常量(在頭文件中使用#define)持有一個端口號,爲一個無符號的短整型(爲了能夠使用htons()來處理它獲得網絡Byte-訂購)。 我在一個單獨的頭文件中定義了一個結構,將PORT,HOSTNAME和GAMEKINDNAME分組(我相信常量名稱非常明瞭,它們都分別存儲爲char數組)。自定義字符數組常量類型轉換爲unsigned short?

初始化結構的規格如下所示:

struct Config configuration_parameters = { 
    .type_of_game = GAMEKINDNAME, 
    .hostname = HOSTNAME, 
    .port = (unsigned short) PORT 
    }; 

在編譯時,我收到以下錯誤:

warning: cast from pointer to integer of different size
error: initializer element is not constant

我認爲這可能是由以下事實引起的焦炭用途1字節的存儲,而無符號短使用2字節的存儲空間,這可能表示某種衝突......這種假設是否正確,如果是的話(或者即使不是),任何人都有如何解決這個問題的想法?

任何幫助,將不勝感激!

+0

爲什麼將它定義爲字符常量?如果它是一個常量,並且你確實需要它是一個字符常量,那麼定義第二個'#define PORT_S 80'(將varname和value替換爲任何適合的值)並使用它。 – Jite

回答

1

我假設你的PORT聲明看起來或多或少是這樣的:

const char *PORT = "12345"; 

如果你投,要unsigned short你會投的價值,而是指針"12345"。使用像atoi這樣的功能來實現:

struct Config configuration_parameters = { 
    .type_of_game = GAMEKINDNAME, 
    .hostname = HOSTNAME, 
    .port = 0 
    }; 
configuration_parameters.port = (unsigned short)atoi(PORT); 
+0

謝謝,那已經幫了大忙!現在錯誤信息發生了變化,但是我得到了以下結果:'config.c:13:error:初始化器元素不是常量' 'config.c:13:error :(接近'configuration_parameters.port'的初始化)'where line 13是struct的結尾,是最後的'};' –

+0

對不起。由於atoi是一個函數,你不能用它來初始化一個結構體。如果你可以用'0'初始化'port'並且在它之後初始化它? (我會相應地更改帖子) – user1781290

+3

如果你正在初始化任何函數之外的configuration_parameters結構體,你將不能使用任何函數調用來完成它。你可以將PORT定義爲一個整數(老實說,我不確定你爲什麼要把它定義爲一個字符串)。 –

相關問題