pragma指令的范围是什么?

时间:2011-02-22 13:21:17

标签: c++ visual-studio-2008 scope header-files pragma

pragma指令的范围是什么?例如,如果我在不同文件B中包含的头文件A中说#pragma warning(disable: 4996),那还会禁用B内的所有警告吗?或者我应该再次在文件A的末尾启用警告吗?

3 个答案:

答案 0 :(得分:18)

直到翻译单元结束。非正式地,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"

答案 1 :(得分:8)

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

对于IBM编译器,例如:

  

可以在任何指定许多pragma指令   点在一个源代码中   编制单位;其他人一定是   在任何其他指令之前指定   或源代码语句。在里面   每个人的个人描述   pragma,“用法”部分描述   对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在声明之后应该有效,无论它来自哪个标题,直到翻译单元结束。但是,有一些pragma会影响整个程序。例如,特定于Microsoft的“链接”编译指示,它将某些库的依赖性添加到翻译单元及其所有“用户”。

答案 2 :(得分:1)

是的,它也会禁用B内的警告。

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

'#pragma push'和'#pragma pop'允许您创建范围。此范围内的#pragma警告将适用于范围的结尾。