ost*_*pus 8 c c++ include header-files
我正在阅读一个文件中相同标题的多个包含,并找到一个有趣的声明(链接):
有两个带头文件的技巧是你故意多次包含它(这确实提供了一个有用的功能).
据我所知,这些技巧可能在实际项目中不受欢迎和困惑(特别是因为人们会采取预防措施来防范多种内容,例如包括警卫和内部人员#pragma once).但是,那些技巧是什么?我提出了一些想法,但希望看到一些实际的例子(理想情况下,安全和尝试).
我的想法:
#include "file"意味着获取头文件并将其所有内容而不是#include行放入.
我们通常使用标头来定义类型,并为源文件添加前向声明.在文件中定义相同类型两次(循环包含将始终导致它)给出编译错误,因此我们使用#ifndef或#pragma once.(或两者)
但我们也可以将重复的代码和宏包含几次,即使在同一个文件中也是如此.在这种情况下,我们不会使用#ifndef也不会#pragma once.如果你这样做,你必须格外小心,只有当你知道自己在做什么时才这样做.
例如:如果在某些操作系统中调用特定的系统函数(或者甚至是交流宏,如offsetof:)会导致一堆警告,并且它会让您感到困扰,并且您确定您的代码是好的,但您不希望禁用所有你在所有项目或文件上都有警告,你只想在调用特定函数时禁用它.
//suppress the warnings:
#if defined(__GNUC__)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreorder"
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wsign-compare"
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#pragma GCC diagnostic ignored "-Wsequence-point"
#endif
#endif // __GNUC__
//here you call the function...
func(x,y,z);
//unsupress: bring back the warnings to normal state
#if defined(__GNUC__)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic pop
#endif
#endif // __GNUC__
Run Code Online (Sandbox Code Playgroud)
这将使您的代码看起来非常脏,特别是如果您多次调用该函数.
一种可能的解决方案,(我不是建议它是最好的......)是制作2个标题,一个用于抑制警告,另一个用于取消抑制.
在这种情况下,您的代码可能如下所示:
#include "suppress.h"
func(x,y,z);
#include "unsuppress.h"
//.... more code come here
//now when call it again:
#include "suppress.h"
func(x,y,z);
#include "unsuppress.h"
Run Code Online (Sandbox Code Playgroud)