Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇数VS名称损坏行为? 考虑下面的WORD代码,我在C++ 64上编译为C++: int test(int argc, char *argv[]); int main(int argc, char *argv[]) { return test(argc, argv); } int test(int argc, char **argv) { return 0; }_C++_Visual Studio 2012_Name Mangling - Fatal编程技术网

奇数VS名称损坏行为? 考虑下面的WORD代码,我在C++ 64上编译为C++: int test(int argc, char *argv[]); int main(int argc, char *argv[]) { return test(argc, argv); } int test(int argc, char **argv) { return 0; }

奇数VS名称损坏行为? 考虑下面的WORD代码,我在C++ 64上编译为C++: int test(int argc, char *argv[]); int main(int argc, char *argv[]) { return test(argc, argv); } int test(int argc, char **argv) { return 0; },c++,visual-studio-2012,name-mangling,C++,Visual Studio 2012,Name Mangling,如果所有这些代码都放在同一个.cpp文件中,它将在VS2012、VS2013、VS2015和mingw32-g++v4.7.1中正确编译和链接,正如我所期望的那样 但是,如果我只是将测试函数的定义移动到一个单独的文件中,则生成的两个文件仍然可以编译并与mingw编译器正确链接,但在我得到的所有版本的VS上: error LNK2019: unresolved external symbol "int __cdecl test(int,char * * const)" (?test@@YAHHQA

如果所有这些代码都放在同一个.cpp文件中,它将在VS2012、VS2013、VS2015和mingw32-g++v4.7.1中正确编译和链接,正如我所期望的那样

但是,如果我只是将测试函数的定义移动到一个单独的文件中,则生成的两个文件仍然可以编译并与mingw编译器正确链接,但在我得到的所有版本的VS上:

error LNK2019: unresolved external symbol "int __cdecl test(int,char * * const)" (?test@@YAHHQAPAD@Z) referenced in function _main"
我可以通过简单地将测试函数中参数argv的声明更改为
char*argv[]
来解决VS中的这个问题,但这不应该是必需的,因为
char*argv[]
char**argv
在用于声明参数时的意思完全相同


我没有尝试过,但它让我怀疑VS是否也会考虑这两个版本对于超载的不同。

对于单独的文件,使用测试(INTARC,CHAR**const ARGV),基于错误消息。请注意,数组(char*argv[])的地址将是常量(因此argv将是常量),而指针指向指针(char**argv)。虽然由于argv是按值传递的,所以不能修改它,所以我不确定为什么VS会对这一点挑剔


当两个函数都在同一个文件中时,显然VS可以检测到测试()不修改ARGV,所以它不抱怨。

< P>是的,这是VisualC++名称装饰方案中的一个错误。对于指针类型参数,顶级常量和volatile限定符被编码到修饰名称中,即使它们与函数的类型无关。因此,例如,
char**
char**const
的编码是不同的。(在您的示例中,
char*[]
相当于
char**const

在确定如何修饰函数名时,编译器将使用函数的第一个声明,即使定义与第一个声明不完全匹配。这就是为什么当定义与主函数位于同一源文件中时,示例会链接:测试函数用第一个声明所需的名称修饰,该名称与从主函数中引用的名称相同

如果将声明和定义移动到单独的源文件中,例如

int test(int argc, char *argv[]);

int test(int argc, char **argv)
{
   return 0;
}

然后你的程序也会成功链接,原因也是一样的。这就是为什么这个“bug”通常不是问题的原因:通常当函数在多个翻译单元中使用时,它们会在头文件中声明,并且到处都包含一个声明。

有人对此提交过bug报告吗?@MikeMB我确信多年来已经有很多关于这个的bug报告。如果你愿意的话,欢迎你在开另一家。请注意,这是一种bug,修复它的成本非常高,但修复的好处非常低。这不太可能很快得到解决(如果有的话)。@James McNellis我还有一个问题要问你,在我的例子中,
char*[]
相当于
char**const
。为什么
const
?我一直认为,仅对于参数,
*[]
等同于
***
,但似乎我弄错了。常量是否以某种方式由
[]
暗示?C99语言规定,
argv
及其表示的字符串都是可修改的(尽管它没有说明
argv
的实际元素)。然而,我在C++11中找不到这个语句。