Рассмотрим следующий ничегонеделания код, который я компиляции в C++ на Win10 64-битном:Нечетное поведение имени пользователя?
int test(int argc, char *argv[]);
int main(int argc, char *argv[])
{
return test(argc, argv);
}
int test(int argc, char **argv)
{
return 0;
}
Если весь этот код помещается в одном .cpp файл, он компилируется и правильно в VS2012, VS2013, VS2015 и mingw32-g ++ v4.7.1, как я ожидал бы этого.
Однако, если я просто переместить определение функции тестирования в отдельный файл в результате два файла компилироваться и ссылка правильно с MinGW компилятором, но на все версии VS я получаю:
error LNK2019: unresolved external symbol "int __cdecl test(int,char * * const)" ([email protected]@[email protected]) referenced in function _main"
I может решить эту проблему в VS, просто изменив объявление параметра argv в тестовой функции на char *argv[]
, но это не обязательно, поскольку char *argv[]
и char **argv
означают то же самое, что и при объявлении параметра.
Я не пробовал, но меня заставляет задуматься, будет ли VS рассматривать две версии, отличающиеся друг от друга для перегрузки.
Неужели кто-нибудь зарегистрировал ошибку? – MikeMB
@MikeMB Я уверен, что за последние годы об этом сообщается множество ошибок. Если вы хотите, вы можете открыть еще один файл https://connect.microsoft.com/VisualStudio. Обратите внимание, что это ошибка, при которой затраты на ее фиксацию очень высоки, но преимущество исправления очень низкое. Вряд ли это будет исправлено в ближайшее время (если вообще). –
@James McNellis У меня есть дополнительный вопрос о вашем утверждении, что 'char * []' эквивалентно 'char ** const' в моем примере. Почему 'const'? Я всегда думал, что только для параметров, '* []' эквивалентен '**', но, похоже, я ошибаюсь. Является ли const каким-то образом подразумевается '[]'?Язык C99 говорит, что и «argv», и строки, которые он представляет, могут быть модифицируемыми (хотя в нем ничего не говорится о фактических элементах «argv»). Однако я не мог найти это утверждение на C++ 11. – BenevolentDeity