Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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
C++ pragma指令的范围是什么?_C++_Visual Studio 2008_Scope_Header Files_Pragma - Fatal编程技术网

C++ pragma指令的范围是什么?

C++ pragma指令的范围是什么?,c++,visual-studio-2008,scope,header-files,pragma,C++,Visual Studio 2008,Scope,Header Files,Pragma,pragma指令的范围是什么?例如,如果我在从另一个文件B中包含的头文件a中说#pragma warning(disable:4996),这是否也会禁用B中的所有警告?还是应该再次启用文件A末尾的警告?直到翻译单元结束。非正式地说,TU是源文件及其包含文件 通常的模式是: #pragma warning (push) //save #pragma warning (disable: xxxx) #pragma warning (disable: yyyy) ... //code #pragm

pragma指令的范围是什么?例如,如果我在从另一个文件B中包含的头文件a中说
#pragma warning(disable:4996)
,这是否也会禁用B中的所有警告?还是应该再次启用文件A末尾的警告?

直到翻译单元结束。非正式地说,TU是源文件及其包含文件

通常的模式是:

#pragma warning (push) //save
#pragma warning (disable: xxxx)
#pragma warning (disable: yyyy)
...

//code

#pragma warning (pop) //restore prev settings
比如说

//A.h
#pragma once
#pragma warning (disable: 1234)
#include "b.h"

//b.h
#pragma once
//when included after a.h 1234 will be disabled

//c.cpp
#include "a.h" //warnings 1234 from b.h is disabled

//d.cpp
#include "b.h" //warnings 1234 from b.h are not disabled
#include "a.h"

pragma特定于所使用的编译器和平台。 所以最好的办法是查看编译器的文档

例如,对于IBM编译器:

可以随时指定许多pragma指令 源代码中的一个点 编辑单位;其他人一定是 在任何其他指令之前指定 或源代码语句。在 每一项的单独描述 pragma,“用法”部分描述 对pragma的 安置

通常,如果指定pragma 指令,然后在 源程序,它适用于 整个编译单元,包括任何 包含的头文件。暂时 指令,它可以出现在 您的源代码,它适用于 指定的点,直到 编译单元的结尾

您可以进一步限制 使用 杂注互补对 围绕选定节的指令 代码的定义。例如,使用#pragma 选项源和#pragma选项 nosource指令如下 请求仅显示选定的零件 您的源代码的 您的编译器列表:

#pragma options source 

/*  Source code between the source and nosource pragma
    options is included in the compiler listing                */

#pragma options nosource
许多pragma提供“pop”或“reset” 允许您启用的子选项 并在中禁用pragma设置 基于堆栈的时尚;这些例子 在相关的pragma中提供 描述


一般来说,pragma应该在声明后立即生效,不管它来自哪个标题,直到翻译单元结束。但是,有一些杂注会影响整个程序。例如,Microsoft特定的“链接”杂注,它向翻译单元及其所有“用户”添加对某些库的依赖性。

是的,它还将禁用B中的警告

翻译单元是一个.cpp文件,它包含的所有文件都扩展成一个大文件。该杂注将持续到翻译单元结束,或直到另一个杂注警告更改设置。或者,如果您的编译器支持#pragma push和#pragma pop,它将持续到下一个#pragma pop


“#pragma push”和“#pragma pop”允许您创建作用域#此类范围内的杂注警告将应用于范围的末尾。

这不是你可以自己测试的东西吗?无论如何,不要使用“启用”-使用“推送”/“弹出”-@Leigh:测试只会揭示某些特定版本在特定测试场景中的行为。这与了解它应该如何工作有很大不同。@sbi:我们都知道“它是如何工作的”和“它应该如何工作”并不总是匹配的。不是说你错了,我只是没有把这个问题理解为“pragma应该如何工作”
+1
,因为“TU的结尾”是正确的,并且给出了强制提示“push”/“pop”。+1,我仍然要提到,
pragma
是特定于编译器的,尽管这是一个“常见”实现,但没有人会受到它的限制。特别地。。。模板和其他内联函数可能会破坏杂注。您使用的是模板定义的pragma堆栈还是当前的?这两种选择都不令人满意:/@armen我相信你的范围规则可能会有例外。请看:@ChrisMorris:我阅读了您链接到的问题和答案,但我看不出它们在任何方面都是“我的”范围规则的例外。我认为它们非常适合。@Chris:任何pragma指令的范围都是从其定义/声明到翻译单元结束。但是实际上语用学是另一个问题(不包括C++标准)。在链接的问题中,警告总是出现在翻译单元的末尾(如接受的答案所述),这是合乎逻辑的。pragma的范围不会改变。而是关于警告的范围。。。