Какие проблемы можно ожидать при компиляции кода C с помощью компилятора C ++?

Как насчет этого:

var imageUrl = 'https://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg';
var blob = null;
var xhr = new XMLHttpRequest(); 
xhr.open('GET', imageUrl, true); 
xhr.responseType = 'blob';
xhr.onload = function() 
{
    blob = xhr.response;
    console.log(blob, blob.size);
}
xhr.send();

http://qnimate.com/javascript-create-file-object-from-url/

из-за той же политики происхождения, работают только с тем же происхождением

34
задан einpoklum 20 November 2015 в 15:47
поделиться

5 ответов

Я когда-то делал что-то подобное. Основной источник проблем заключался в том, что C ++ более строг к типам, как вы и подозревали. Вам нужно будет добавить приведение типов, в которых void * смешивается с указателями других типов. Подобно выделению памяти:

Foo *foo;
foo = malloc(sizeof(*foo));

Выше приведен типичный код C, но для него потребуется преобразование в C ++:

Foo *foo;
foo = (Foo*)malloc(sizeof(*foo));

В C ++ появились новые зарезервированные слова, такие как "class", "и", "bool", " catch "," delete "," явный "," изменяемый "," namespace "," new "," operator "," or "," private "," protected "," friend "и т. д. Их нельзя использовать в качестве имена переменных, например.

Вышеупомянутые, вероятно, наиболее распространенные проблемы, когда вы компилируете старый код C с помощью компилятора C ++. Полный список несовместимостей см. см. Несовместимость между ISO C и ISO C ++ .

Вы также спрашиваете об изменении имени. В отсутствие внешних оболочек "C" компилятор C ++ будет искажать символы . Это не проблема, если вы используете только компилятор C ++ и не полагаетесь на dlsym () или что-то подобное для извлечения символов из библиотек.

33
ответ дан 27 November 2019 в 16:33
поделиться

Если я не заверну все мои файлы C в "extern C {...}", получу ли я искажение имен там, где я меньше всего этого ожидаю?

Это кусается. вы, когда пытаетесь связать вместе C и C ++.

Я написал много файлов заголовков, содержащих:

#ifdef __cplusplus
    extern "C" {
#endif

// rest of file

#ifdef __cplusplus
    }
#endif

Через некоторое время он сливается с существующим шаблоном с несколькими включениями, и вы перестаете его видеть. Но вы должны быть осторожны, где вы его помещаете - обычно он принадлежит после , любой включает ваш заголовок.

Есть ли какая-то причина, по которой мне действительно не следует этого делать?

Если вы знаете, конечно, вы не собираетесь комбинировать C и C ++, тогда я знаю, что нет причин для этого. Но с постепенной миграцией, которую вы описываете, это важно для всего, что связано с опубликованным интерфейсом, который необходимо использовать как компонентам C, так и компонентам C ++.

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

8
ответ дан 27 November 2019 в 16:33
поделиться

Другой пример: неявное преобразование целых чисел в перечисления в C ++ отсутствует, тогда как оно есть в C. Вам понадобится приведение типов, если вы действительно хотите сделать это в C ++.

3
ответ дан 27 November 2019 в 16:33
поделиться

В C ++ более строгая проверка типов, поэтому вам может потребоваться добавить приведение к каждому вызову malloc / realloc / calloc.

1
ответ дан 27 November 2019 в 16:33
поделиться

См. Несовместимость между ISO C и ISO C ++ для очень подробного списка всех несовместимостей. Есть много тонких проблем, в том числе некоторые, которые не сразу проявляются в ошибке компилятора. Например, проблема может быть в размере символьных констант:

// In C, prints 4.  In C++, prints 1
printf("%d\n", sizeof('A'));
22
ответ дан 27 November 2019 в 16:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: