簡體   English   中英

#定義在C ++中沒有空終止的char數組

[英]#define a char array without null termination in C++

我正在研究需要非常快速的啟動時間的行業安全產品。 我正在嘗試遵循輸出ASCII文件的行業標准。 為了加快此文件格式化步驟,我使用了#define來在靜態內存中創建多個字符數組。 例如,這是一小部分:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY          "60\r\n"
#define COMTRADE_FILE_TYPE          "BINARY\r\n1\r\n"

struct TS_ComtradeConfig
{
    const char StationID[sizeof(COMTRADE_STATION_ID)];
    const char ChannelCount[sizeof(COMTRADE_CHANNEL_COUNT)];
    char Frequency[sizeof(COMTRADE_FREQUENCY)];
    const char FileType[sizeof(COMTRADE_FILE_TYPE)];
};

TS_ComtradeConfig ConfigFile =
{
        {COMTRADE_STATION_ID},
        {COMTRADE_CHANNEL_COUNT},
        {COMTRADE_FREQUENCY},
        {COMTRADE_FILE_TYPE}
};

這是我用來打印出來的一些基本代碼。

for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++)
{
    printf("%c", ((char*)(ConfigFile.StationID))[nIndex]);
}

這對於生成靜態char數組非常有用,並且對於將整個ConfigFile作為一個整體打印出來也可以正常工作,但是char數組以null終止,這意味着最終結果不符合行業標准。 似乎#define字符串正在由預處理程序以空值終止。 有沒有辦法解決? 或執行這種高速操作的任何其他方法?

字符串串聯如何:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999\r\n"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0D\r\n"
#define COMTRADE_FREQUENCY          "60\r\n"
#define COMTRADE_FILE_TYPE          "BINARY\r\n1\r\n"

#define COMTRADE_ALL COMTRADE_STATION_ID COMTRADE_CHANNEL_COUNT COMTRADE_FREQUENCY COMTRADE_FILE_TYPE

    // no struct, plain char array, no intervening nulls (but a trailing one)
char[sizeof(COMTRADE_ALL)] comTradeAll = COMTRADE_ALL; 
 for(int nIndex = 0; nIndex < sizeof(ConfigFile); nIndex++) { printf("%c", ((char*)(ConfigFile.StationID))[nIndex]); } 

我不知道為什么你打印出來這樣的, charchar 如果該結構中有填充,則您會遇到麻煩。

為什么不通過成員迭代ConfigFilefwrite呢? 將整個循環替換為:

// Add a -1 to the size to skip the \0
fwrite(ConfigFile.StationID, sizeof(ConfigFile.StationID) - 1, 1, stdout);
fwrite(ConfigFile.ChannelCount, sizeof(ConfigFile.ChannelCount) - 1, 1, stdout);
fwrite(ConfigFile.Frequency, sizeof(ConfigFile.Frequency) - 1, 1, stdout);
fwrite(ConfigFile.FileType, sizeof(ConfigFile.FileType) - , 1, stdout);

該代碼不僅更加清晰(因為您沒有進行奇怪的char指針破解),而且還能准確打印出您想要的內容。 由於您沒有要處理的格式化字符串(它只是進行數據轉儲),因此它的效率也可能略高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM