В языке C не используется изменение имен, как в C ++. Это может привести к незаметным ошибкам, когда прототип функции объявлен по-разному в разных файлах. Простой пример:
/* file1.c */
int test(int x, int y)
{
return y;
}
/* file2.c */
#include <stdio.h>
extern int test(int x);
int main()
{
int n = test(2);
printf("n = %d\n", n);
return 0;
}
При компиляции такого кода с помощью компилятора C (в моем случае gcc) ошибок не сообщается. После перехода на компилятор C ++ компоновка завершится ошибкой «неопределенная ссылка на 'test (int)'». К сожалению, на практике это не так просто - бывают случаи, когда код принимается компилятором C (с возможными предупреждающими сообщениями), но компиляция не выполняется при использовании компилятора C ++.
Это, конечно, плохая практика кодирования - все прототипы функций должны быть добавлены в файл .h, который затем включается в файлы, в которых функция реализована или используется. К сожалению, в моем приложении таких случаев много, и исправить все в ближайшее время невозможно. Переход на g ++ тоже невозможен, я довольно быстро получил ошибку компиляции.
Одним из возможных решений было бы использовать изменение имени C ++ при компиляции кода C. К сожалению, gcc не позволяет этого сделать - я не нашел для этого параметра командной строки. Вы знаете, можно ли это сделать (может быть, использовать другой компилятор?). Мне также интересно, могут ли некоторые инструменты статического анализа это уловить.
extern "C"{} block
, чтобы он знал, что не нужно искать искаженную версию - person Grady Player   schedule 30.07.2014grep
твой друг ... - person cmaster - reinstate monica   schedule 30.07.2014__stdcall
(или__fastcall
) и компилируете для 32-битных систем. - person T.C.   schedule 30.07.2014__stdcall
. - person T.C.   schedule 31.07.2014