pragma指令的范围是什么?例如,如果我在不同文件B中包含的头文件A中说#pragma warning(disable: 4996)
,那还会禁用B内的所有警告吗?或者我应该再次在文件A的末尾启用警告吗?
答案 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警告将适用于范围的结尾。