[英]#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]); }
我不知道為什么你打印出來這樣的, char
的char
。 如果該結構中有填充,則您會遇到麻煩。
為什么不通過成員迭代ConfigFile
和fwrite
呢? 將整個循環替換為:
// 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.