今天,同事爲了讓代碼數據正確顯示到界面上,要求我通過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()函數實現主機字節序轉換成網絡字節序(大端字節序);
總結:
- 全局變量是保存在靜態存儲區,只能用常量進行初始化
- 局部變量,初始化可常量,變量賦值