小编Oli*_*ver的帖子

C中的条件#include

有没有办法用 c 预处理器进行条件包含?

我有一个由不同团队共享的工具“库”(Tools.c、Tools.h)。该库依赖于提供 XML 功能的第二个库。让我们称之为 XML.h 现在一个团队使用第二个库 (XML.h) 的普通版本,而另一个团队在他们的项目中使用扩展版本 (XMLEx.h)。第二个团队不想包含 XML.h,因为他们已经包含 XMLEx.h,提供 XML.h 的所有功能。

是否有一种机制来实现类似的东西:

#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif
Run Code Online (Sandbox Code Playgroud)

只有#define XML_EX在更高(项目)级别?喜欢

#include "Tools.h"
Run Code Online (Sandbox Code Playgroud)

对于第 1 队和

#define XML_EX
#include "Tools.h"
Run Code Online (Sandbox Code Playgroud)

对于第 2 队?(我知道简单的解决方案行不通,更多的是为了说明所需的“工作流程”。)

边界条件是:

  • 视窗系统
  • CVI/法律Windows IDE
  • 没有制作文件
  • Tools.h 应该在没有外部项目的情况下编译。

编辑:对于建议的解决方案和提示,这是常见的方式,也许它与我的构建过程有关,但它不起作用。IDE 抱怨团队 2 缺少 XML.h。我想,这是因为 IDE 尝试首先独立编译每个源代码,而不知道“外部”#define。

编辑:让我们假设,A 团队是一群白痴,怎么只能点击 IDE 中的“运行”按钮。因此,它最好开箱即用。

编辑:好的,这让我感到困惑。我所学到的一切都告诉我,它应该有效。这是一个最小的集合,我已经测试过:

主文件

#define XML_EX
#include "Tools.h"

void main(void)
{
  test();
}
Run Code Online (Sandbox Code Playgroud)

然后Tools.h

#ifdef XML_EX
  #include "XMLEx.h"
#else
  #include "XML.h"
#endif
Run Code Online (Sandbox Code Playgroud)

XMLEx.h 具有测试功能,而 …

c include c-preprocessor

5
推荐指数
1
解决办法
1万
查看次数

如何处理Typedef而在标头中不包含标头

至于处理更大的项目,我想抛出一些自己的类型(例如myType)。“赶入”方法是将这些typedef放入标头中(让我们说myType.h),以及一堆针对这些类型的函数。

如果我在某处使用新类型,则将其包含myType.h到源文件中。精细。

但是,如果要在某处使用新类型作为函数签名中的参数,则需要myType.h在包含该函数的模块的标头中包含。对于一个或另一个typedef,这对我来说似乎还可以,但是我拥有的类型越多,我需要的头文件中包含的内容就越多,可能会包含更多的头文件,同时使用包含其他自己类型的类型。这就是我所说的“ 依赖地狱 ”。

有没有聪明,时尚,最佳实践的方法来解决这一难题?

我知道有可能将这些类型作为空指针传递,然后将它们强制转换回函数内部,但随后我从编译器中放开了重要的类型检查。

此外,extern在这里被认为是最差的做法。

编辑:

详细:

myType.h

#include "otherType.h"

typedef struct {
  char Name[32];
  int Size;
  otherType someType;
} myType;

processSomeHow(myType _myType, int NewSize);
Run Code Online (Sandbox Code Playgroud)

otherType.h

#define SOME_CONST 32

typedef struct { [...] } otherType;
Run Code Online (Sandbox Code Playgroud)

someModule.h

#include "myType.h"

int specialProcessSomeHow(myType _myType);
Run Code Online (Sandbox Code Playgroud)

someModule.c

int specialProcessSomeHow(myType _myType)
{
  int Size = 64;
  return(processSomeHow(_myType, Size));
}
Run Code Online (Sandbox Code Playgroud)

现在,我otherType.h间接地将someModule.h它包含到每个模块中,更糟糕的是,将其包含到someModule.h。现在我SOME_CONST到处都有,很难知道它来自哪里。我必须维护两个包含树。

c typedef include

5
推荐指数
1
解决办法
1589
查看次数

无法使用Datagrip提交对表的更改

我使用Datagrip 2016.3。当我尝试更改表中的值时,无法将其提交到数据库(Oracle SQL-DB)。

我该怎么做:-将单元格设置为/一些新值-按对勾图标(“提交”)-和/或按CTRL + RETURN-关闭标签-重新打开标签-/新值不见了,旧的一个仍然在那里。

我在不同的方案(和不同的数据库)上用不同的表进行了尝试。该列可为空,输入的值合法。我可以使用Oracle SQL Developer修改值。

编辑(20170116)

对于遇到问题后的大多数测试,我尝试更改本地oracle安装的标准HR模式的COUNTRY表。可以使用SQL Developer更改同一表。

sql oracle datagrip

3
推荐指数
1
解决办法
2125
查看次数

标签 统计

c ×2

include ×2

c-preprocessor ×1

datagrip ×1

oracle ×1

sql ×1

typedef ×1