Минимально инвазивное изменение для strchr на unsigned char * в C ++ из базы кода C?

Я пытаюсь скомпилировать кодовую базу C как C ++, настраивая некоторые из включений. Оно использует strchr() на беззнаковых указателях символов, например:

#include <string.h>
#include <stdio.h>

// Cannot modify this file with any non-C-isms, but let's say an include can
// be changed (although all things being equal I'd rather not)
#include <SomethingICanChange.h>

int main(int argc, char* argv[]) {
unsigned char b = 'B';
unsigned char const * str = "ABC";
unsigned char const * pos = strchr(str, b);
if (pos) {
printf("position is %d\n", pos - str);
}
return 0;
}

Это вызывает ошибку в C ++ (по причинам, объясненным в другом месте) … даже с -fpermissive,

test.c: In function ‘int main(int, char**)’:
test.c:6:33: warning: invalid conversion from ‘const char*’ to ‘const unsigned char*’ [-fpermissive]
test.c:7:46: error: call of overloaded ‘strchr(const unsigned char*&, unsigned char&)’ is ambiguous
test.c:7:46: note: candidates are:
In file included from test.c:1:0:
/usr/include/string.h:215:14: note: char* strchr(char*, int) <near match>
/usr/include/string.h:215:14: note:   no known conversion for argument 1 from ‘const unsigned char*’ to ‘char*’
/usr/include/string.h:217:22: note: const char* strchr(const char*, int) <near match>
/usr/include/string.h:217:22: note:   no known conversion for argument 1 from ‘const unsigned char*’ to ‘const char*’

Обычно, когда сталкиваюсь с такими вещами, я иду «strchr, гадость, просто избавься от этого полностью». Но я не хочу изменять эти файлы самостоятельно, и это код на C, который очень переносим на довольно старые платформы. Они не были бы рады помещать вызовы в места вызова, чтобы успокоить C ++ … хотя, если бы «струхр» существовал и был стандартным, они, вероятно, использовали бы его.

Я также могу взломать его так или иначе, как в SomethingICanChange.h Я мог бы добавить:

unsigned char const * strchr(unsigned char const * s, int c) {
return (unsigned char const *)strchr((char const *)s, c);
}

Это работает с -fpermissive, Но я не смог бы проверить эту перегрузку в кодовой базе C (ну, без #ifdef). Просто интересно, если у кого-нибудь есть идея получше, я добавлю struchr если это то, что делают люди в этой ситуации (или какое-либо другое имя, если оно общее).

2

Решение

Начальная нотаЯ знаю, что это тоже довольно уродливый поступок, но он может помочь вам (надеюсь) с лучшей идеей!

Как насчет использования макроса:

#define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c))

Вы можете включить его как флаг компиляции (-D) из вашего скрипта Makefile / build. Я предполагаю, что у вас есть собственный скрипт Makefile / build для вашего проекта C ++, поэтому вам не нужно добавлять этот макрос в базу кода C.

Сделать это немного лучше использовать дополнительный файл, который вы включаете из скрипта Makefile / build, который добавляет эти макросы (более) структурированным способом CPPFLAGS

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]