我需要将只读 .h 文件的某些部分(例如从第 10 行到第 15 行)用于 .C 文件。
注意:我无法编辑 .h 文件,因为那不是来自我的模块。我也不能使用所有的 .h 文件变量。
有没有办法像这样使用?
作为包含的客户端代码,您无法任意控制使用包含的标头中的哪些行。
一些标头通过使用#if
#ifdef
or明确授予控制权,#ifndef
以便您可以在包含该标头之前设置一些预处理器定义并影响使用哪些行。
否则,您有时可以声明自己需要访问的变量,但我强烈反对这样做:随着标头的发展,很容易导致您的声明与标头不同。这在 C++ 中尤其糟糕,头文件的作者可能有理由期望在不破坏客户端重新编译干净的能力的情况下更改class X
为template <...> class XT ...; typedef XT<...> X;
,但是如果您class X;
在自己的代码中声明了“”,这将与它作为模板发生冲突。
您在评论中解释了您需要的更具体细节:
我只需要使用来自不同模块(.h 文件)的几个变量。如果我对所有 .h 文件使用#include,那么“'Tabc_st' 的冗余重新声明,'Ta[b]c_st' 的先前声明在这里”警告将出现..... – laki
我猜想使用了某种“匈牙利”符号,并且在从恶心中恢复过来之后,假设T
是 for type 和_st
for struct
。如果是这样,您要么有多个struct Tabc_st
声明或typedef ... Tabc_st;
s. 要评论其他答案中列出的选项:
#include
单独命名空间中的冲突标头:这是解决问题的一种适度干净、结构化的方法,但可能适得其反:例如 - 如果标头公开了您计划为其链接库的功能,则损坏的名称将不匹配和链接将失败。
#define
Tabc_st WhateverElse 围绕所有但有问题的标头:这对于 typedef 非常有用,但因为struct Tabc_st
它确实意味着标头中稍后对该类型的任何使用都将改为看到“WhateverElse” - 如果您打算能够取一个 Tabc_st 并将其与任何标题中的任何代码一起使用,您会发现这不会成功,因为它们现在都期望不同的类型。
另一种方法是提供一个 .h/.cpp 对,包装每个有问题的 .h 并使用新的非冲突名称公开其功能。这是相当多的工作来维护。
一个可行的 hack 可能是编写预编译步骤的脚本,例如:
TABC_ST=`fgrep 'struct Tabc_st;' header1.h`
fgrep -v --line-regexp $TABC_ST header2.h > header2_sans_tabc.h
fgrep -v --line-regexp $TABC_ST header3.h > header3_sans_tabc.h
然后使用..._sans_tabc.h
标题....
你可以做
#define Tabc_st bogus_thing_I_can_ignore
#include <readonlyheaderfile.h>
#undef Tabc_st
并且头文件将声明 bogus_thing_I_can_ignore 而不是重新声明 Tabc_st。如果 Tabc_st 是 typedef 名称并且标头使用该类型,这仍然有效,因为 typedef 只是别名,而不是新类型。
如果无法编辑头文件,则无法仅使用部分代码。我强烈建议您使用不同的命名空间来解决变量名冲突。如果您试图仅包含部分代码以节省内存……请不要这样做。很少有无用的变量没什么大不了的。