Я хочу написать макрос для записи строки, используя оптимизацию во время компиляции, чтобы узнать длину строкового литерала.Но мне нужно обнаружить неправильное использование, используя указатели.
Вот что я имею в виду:
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
}
При втором вызове размер будет бессмысленным (размер указателя).
Я хочу выдать ошибку во время компиляции, если я попытаюсь использовать tx_string для чего угодно, кроме строкового литерала.Это использует gcc;Есть ли какая-нибудь gcc вещь, которую я могу использовать для этого?
Редактировать: я работаю с буферами данных, которые могут содержать нули или не заканчиваться нулями.Я ДЕЙСТВИТЕЛЬНО хочу запретить использование указателей для этого и предотвратить использование strlen()
во время выполнения.
Edit 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» выглядит хорошо, ноболее значимая ошибка времени компиляции была бы бонусом.