#define 个字符数组,C++中没有空终止
#define a char array without null termination in C++
我正在开发一种需要非常快启动时间的行业安全产品。我正在尝试遵循输出 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);
代码不仅更清晰(因为你没有做奇怪的字符指针黑客),它准确地打印出你想要的东西。它也可能稍微更有效,因为您没有要处理的格式字符串(它只是执行数据转储)。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- llvm构建器向基本块添加终止符
- 如何使用隔离>终止执行来停止所有线程
- 用于将C++代码转换为 Web 程序集的脚本未终止
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 终止 QProcess 不会终止子进程
- 运行代码时,c++ 会终止进程
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 在输入句子时终止 std::out_of_range
- 二进制搜索的终止点
- MPI:检查是否有任何进程已终止
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- while 循环不以哨兵值终止
- C++ 程序不会因为内存而终止
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常