繁体   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