結構體初始化 initializer element is not constant

今天,同事爲了讓代碼數據正確顯示到界面上,要求我通過udp服務器發送參數設置給界面,我的主機是小端模式,對方是大端接收。本來想模擬一組數據發送過去試一試。結果發現得給他 轉換字節序,於是發現瞭如下全局變量賦值的問題。由於是測試數據,最後就用不大於F的數進行模擬了。記錄如下:

結構體初始化 initializer element is not constant
1. 例子
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>

typedef struct
{
    unsigned int ulRecvPara;
    unsigned int ulSendPara;
    unsigned char ucSwitch;
}SETSYSPARA_ST;

SETSYSPARA_ST stParrRight ={
    .ulRecvPara = 0x10,
    .ulSendPara = 0x20,
    .ucSwitch  = 0x1,
};
/*結構體初始化錯誤典型如下
SETSYSPARA_ST stParaError = {
    .ulRecvPara = htonl(0x10),
    .ulSendPara = htonl(0x20),
    .ucSwitch  = 0x1,
};
*/
int main(int argc, char**argv)
{
    return 0;
}
2.分析

全局變量是保存在靜態存儲區的,因此在編譯的時候只能用常量進行初始化,而不能用變量進行初始化。全局變量的內存地址直接存儲變量的值。在該程序中是用函數htonl的返回值給結構體成員進行初始化的,因此會出錯.initializer element is not constant
htonl()函數實現主機字節序轉換成網絡字節序(大端字節序);

總結:

  1. 全局變量是保存在靜態存儲區,只能用常量進行初始化
  2. 局部變量,初始化可常量,變量賦值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章