我想编写一个宏来编写一个字符串,使用知道字符串文字长度的编译时优化。但是我需要使用指针来检测错误。如何区分C宏中的char *的常量字符串
这里就是我的意思是:
void transmit(const char *data, int length);
#define tx_string(x) transmit((x), sizeof(x) -1)
void func(char *badmsg) {
tx_string("GO"); // ok
tx_string(badmsg); // not OK
}
随着第二个呼叫,规模将是废话(的sizeof指针)。
如果我试图在字符串字面以外的任何地方使用tx_string,我想产生一个编译时错误。这是使用gcc;有没有我可以用来做到这一点的gcc东西?
编辑:我使用的数据缓冲区可能包含空值或不能被空值终止。我真的想防止指针被用于此,并防止运行时使用strlen()
。
编辑2:
下面是这将导致一个问题的例子。 我会发明一个假想的协议,我必须告诉16位微控制器一个地址,使用命令GO后跟16位原始地址(两个8位字符),我想从地址0开始。
#define GOSEQ "GO\000\000"
void func(void) {
char *bad = GOSEQ;
tx_string(GOSEQ); // ok, sends 4 bytes: GO and two zero bytes
tx_string(bad); // bad, using runtime strlen sends two characters "GO"
}
我觉得肯定有一定的gcc内建检查。我看到Linux内核源码使用编译时区分技巧很多,但是不能很快使用特定的技巧。
到目前为止,“Windows程序员”的想法看起来不错,但更有意义的编译时错误将是一个奖金。
这看起来像赢家!如果有人想出完美的内置测试或其他内容,我会稍微等一下。 – blueshift