#define 个字符数组,C++中没有空终止

#define a char array without null termination in C++

本文关键字:终止 C++ 字符 数组 #define      更新时间:2023-10-16

我正在开发一种需要非常快启动时间的行业安全产品。我正在尝试遵循输出 ASCII 文件的行业标准。为了加快此文件格式步骤,我使用 #define 在静态内存中创建多个字符数组。例如,这里有一小节:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999rn"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0Drn"
#define COMTRADE_FREQUENCY          "60rn"
#define COMTRADE_FILE_TYPE          "BINARYrn1rn"
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 数组,并且适用于

打印出整个配置文件,但 char 数组以 null 结尾,这意味着最终结果不符合行业标准。似乎 #define 字符串被预处理器以 null 终止。有什么办法吗?或者任何其他方法都可以进行这种高速操作?

字符串连接怎么样:

#define COMTRADE_STATION_ID         "Station Name,Device ID,1999rn"
#define COMTRADE_CHANNEL_COUNT      "10,10A,0Drn"
#define COMTRADE_FREQUENCY          "60rn"
#define COMTRADE_FILE_TYPE          "BINARYrn1rn"
#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 
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);

代码不仅更清晰(因为你没有做奇怪的字符指针黑客),它准确地打印出你想要的东西。它也可能稍微更有效,因为您没有要处理的格式字符串(它只是执行数据转储)。