我想編寫一個宏來編寫一個字符串,使用知道字符串文字長度的編譯時優化。但是我需要使用指針來檢測錯誤。如何區分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