結(jié)構(gòu)體初始化 initializer element is not constant

今天,同事為了讓代碼數(shù)據(jù)正確顯示到界面上,要求我通過udp服務(wù)器發(fā)送參數(shù)設(shè)置給界面,我的主機是小端模式,對方是大端接收。本來想模擬一組數(shù)據(jù)發(fā)送過去試一試。結(jié)果發(fā)現(xiàn)得給他 轉(zhuǎn)換字節(jié)序,于是發(fā)現(xiàn)了如下全局變量賦值的問題。由于是測試數(shù)據(jù),最后就用不大于F的數(shù)進行模擬了。記錄如下:

結(jié)構(gòu)體初始化 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,
};
/*結(jié)構(gòu)體初始化錯誤典型如下
SETSYSPARA_ST stParaError = {
    .ulRecvPara = htonl(0x10),
    .ulSendPara = htonl(0x20),
    .ucSwitch  = 0x1,
};
*/
int main(int argc, char**argv)
{
    return 0;
}
2.分析

全局變量是保存在靜態(tài)存儲區(qū)的,因此在編譯的時候只能用常量進行初始化,而不能用變量進行初始化。全局變量的內(nèi)存地址直接存儲變量的值。在該程序中是用函數(shù)htonl的返回值給結(jié)構(gòu)體成員進行初始化的,因此會出錯.initializer element is not constant。
htonl()函數(shù)實現(xiàn)主機字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序(大端字節(jié)序);

總結(jié):

  1. 全局變量是保存在靜態(tài)存儲區(qū),只能用常量進行初始化
  2. 局部變量,初始化可常量,變量賦值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方文檔 初始化 Initialization是為準備使用類,結(jié)構(gòu)體或者枚舉實例的一個過程。這個過程涉及了在實例里...
    hrscy閱讀 1,205評論 0 1
  • 1.流程 創(chuàng)建 HelloWorld.java代碼如下package jvm; /** * @author ...
    RunAlgorithm閱讀 1,431評論 4 6
  • 不到20個小時的時間, 你便與我揮手告別。 我不愿與你分別, 但你還是慢慢松開我的手 緩緩離去 回想與你走過的時光...
    YolandaYanyoyo閱讀 251評論 0 1
  • 昨天,父親在朋友圈里發(fā)了家里紫陽花開的照片。我看到那張照片,卻有一種要淚流滿面的感覺。 離開故鄉(xiāng)獨自生活在城市,一...
    冉染閱讀 493評論 0 0
  • 這星期去學校的星期二,我們將會迎來萬圣節(jié)。 萬圣節(jié)是每年的公歷10月31日,農(nóng)歷9月12。...
    曾經(jīng)我們都很好閱讀 287評論 0 0

友情鏈接更多精彩內(nèi)容