C++ pragma指令的范围是什么?
pragma指令的范围是什么?例如,如果我在从另一个文件B中包含的头文件a中说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 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的范围不会改变。而是关于警告的范围。。。