Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
Visual c++ 在C++/CX,为什么不';t未引用的hat^参数是否生成警告?_Visual C++_Compiler Warnings_C++ Cx_Visual C++ 2012 - Fatal编程技术网

Visual c++ 在C++/CX,为什么不';t未引用的hat^参数是否生成警告?

Visual c++ 在C++/CX,为什么不';t未引用的hat^参数是否生成警告?,visual-c++,compiler-warnings,c++-cx,visual-c++-2012,Visual C++,Compiler Warnings,C++ Cx,Visual C++ 2012,我正在开发一个Windows应用商店应用程序,刚刚将Visual Studio的警告级别提高到4级,所以我一直在修复未引用的参数警告。在这个过程中,我注意到未引用的框架管理参数(^)不像其他未引用的“正式”参数那样生成C4100警告。为了说明我的意思: void Method(CNonFrameworkManaged* pObject) { // Warning C4100: 'pObject' : unreferenced formal parameter } void Method

我正在开发一个Windows应用商店应用程序,刚刚将Visual Studio的警告级别提高到4级,所以我一直在修复未引用的参数警告。在这个过程中,我注意到未引用的框架管理参数(^)不像其他未引用的“正式”参数那样生成C4100警告。为了说明我的意思:

void Method(CNonFrameworkManaged* pObject)
{
    // Warning C4100: 'pObject' : unreferenced formal parameter
}

void Method(CFrameworkManaged^ spObject)
{
    // No warning
}
为什么第二个不生成警告?有没有办法打开这些警告?我希望我的代码看起来是一致的,但手动跟踪所有这些代码需要几天时间


注意:我在编译没有CLR支持的项目时,似乎仍然可以检测到它们。

帽子类型是智能指针的一种形式,因此每个帽子类型都有一个析构函数,它释放指向对象的所有权。虽然在源代码中,
spObject
未按名称引用,但该对象由编译器在函数末尾生成的对析构函数的调用引用

当编译器检查未引用的局部变量时,它会找到该引用,并且不会发出警告。普通(非参数)局部变量必须有一个名称,如果编译器对仅存在以销毁的此类局部变量发出“未引用局部变量”警告(例如,RAII类型,如
lock\u guard
),则会出现问题。针对未引用的非参数局部变量发出警告C4101和C4189。(编译器能否以不同的方式处理参数?可能。但事实并非如此。)

请注意,对于具有析构函数的类型的任何参数,都不会发出C4100:

struct A { };
struct B { ~B() { } };

void f(A a) { } // C4100 is issued for 'a'
void f(B b) { } // C4100 is not issued for 'b'

帽子类型是智能指针的一种形式,因此每个帽子类型都有一个析构函数,它释放指向对象的所有权。虽然在源代码中,
spObject
未按名称引用,但该对象由编译器在函数末尾生成的对析构函数的调用引用

当编译器检查未引用的局部变量时,它会找到该引用,并且不会发出警告。普通(非参数)局部变量必须有一个名称,如果编译器对仅存在以销毁的此类局部变量发出“未引用局部变量”警告(例如,RAII类型,如
lock\u guard
),则会出现问题。针对未引用的非参数局部变量发出警告C4101和C4189。(编译器能否以不同的方式处理参数?可能。但事实并非如此。)

请注意,对于具有析构函数的类型的任何参数,都不会发出C4100:

struct A { };
struct B { ~B() { } };

void f(A a) { } // C4100 is issued for 'a'
void f(B b) { } // C4100 is not issued for 'b'

“我在编译没有CLR支持的项目”C++/CX和C++/CLI是互斥的:在单个项目中无法将C++/CX与“CLR支持”结合起来。“我在编译没有CLR支持的项目”C++/CX和C++/CLI是互斥的:在单个项目中无法将C++/CX与“CLR支持”结合起来。谢谢,这是一个很好的答案。我相信这也引出了这样一个问题:注释掉未引用的^参数的名称是否会允许编译器删除对智能指针构造函数/析构函数的调用?@FrolickingFerret:无论参数是否有名称,行为都是相同的。这就是说,在许多情况下,编译器可以在hat上省略对AddRef和Release的调用,因为编译器完全了解COM引用计数的工作原理(比如说,与共享的\u ptr引用计数的工作原理相反——对于编译器来说,共享的\u ptr与任何其他类型的引用计数一样)。我可以写一个更深入的解释,但可能不能在周五之前。这很有趣。编译器能够将省略应用于hat是有意义的。我真的没有考虑过这与共享ptr之类的东西。汉克斯,这是一个很好的答案。我相信这也引出了这样一个问题:注释掉未引用的^参数的名称是否会允许编译器删除对智能指针构造函数/析构函数的调用?@FrolickingFerret:无论参数是否有名称,行为都是相同的。这就是说,在许多情况下,编译器可以在hat上省略对AddRef和Release的调用,因为编译器完全了解COM引用计数的工作原理(比如说,与共享的\u ptr引用计数的工作原理相反——对于编译器来说,共享的\u ptr与任何其他类型的引用计数一样)。我可以写一个更深入的解释,但可能不能在周五之前。这很有趣。编译器能够将省略应用于hat是有意义的。我真的没有考虑过这与共享ptr之类的东西。T