我需要在.C文件中使用只读.h文件的某些部分(如第10行到第15行)。
注意:我不能编辑.h文件,因为它不是来自我的模块。另外,我不能使用所有的.h文件变量。
有没有像这样使用的方法?
发布于 2013-05-09 13:01:24
作为included客户端代码,您不能随意控制使用included头中的哪些行。
一些标头通过使用#if、#ifdef或#ifndef显式地授予控制,这样您就可以设置在包含标头之前定义一些预处理器,并影响使用哪些行。
否则,您有时可以声明需要自己访问的变量,但我强烈建议您这样做:随着头部的发展,很容易导致声明与头部不同。这在C++中尤其糟糕,头文件的作者可能会合理地期望在不破坏客户端干净地重新编译的能力的情况下将class X更改为template <...> class XT ...; typedef XT<...> X;,但是如果您在自己的代码中声明了"class X;“,这将与它作为模板相冲突。
你已经在评论中解释了你需求的更多具体细节:
我只需要使用来自不同模块( .h文件)的几个变量。如果我为所有的.h文件使用#include,那么“'Tabc_st‘的冗余重新声明,'Tabc_st’的先前声明在这里”的警告将出现.....- laki
我猜是使用了某种“匈牙利”符号,并在从恶心中恢复后,假设T代表类型,_st代表struct。如果是这样的话,您已经有了多个struct Tabc_st声明或typedef ... Tabc_st;。
在不同的命名空间中使用冲突的头文件:这是一种比较干净,结构化的方法,但是可能会适得其反:例如,如果头文件暴露了你计划链接库的功能,那么损坏的名称将不匹配,并且链接将绕过所有有问题的头文件-但只有一个:这对
#include非常有效。但是对于struct Tabc_st来说,这确实意味着以后在头部中使用该类型时会看到"WhateverElse“--如果你想要获取一个Tabc_st并将其与任何头部中的任何代码一起使用,你会发现这并不管用,因为它们现在都需要不同的类型。另一种方法是提供一个.h/.cpp对,它包装每个有问题的.h,并使用新的非冲突名称公开它的功能。这是相当多的工作需要维护。
一种可行的方法可能是编写一个预编译步骤,例如:
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标头...
发布于 2013-05-09 13:16:43
你可以做到
#define Tabc_st bogus_thing_I_can_ignore
#include <readonlyheaderfile.h>
#undef Tabc_st并且头文件将声明bogus_thing_I_can_ignore而不是重新声明Tabc_st。如果Tabc_st是一个typedef名称,并且头文件使用该类型,这仍然有效,因为typedefs只是别名,而不是新类型。
发布于 2013-05-09 13:04:44
如果你不能编辑头文件,就没有办法只使用部分代码。我强烈建议您使用不同的名称空间来解决变量名冲突。如果你试图只包含代码的一部分来节省内存……不要这么做。有几个无用的变量没什么大不了的。
https://stackoverflow.com/questions/16454604
复制相似问题