2011-05-03 153 views
3

我想知道是否有可能在C中的main()函数中包含一些东西。#include里面的main()函数

例如,在Cell程序中,我定义了cache-api.h的参数,稍后在我想要更改的main()函数中。

我知道用#define定义的东西可以用程序中任何地方的#undef来定义,但是在重新定义我需要的参数之后,我必须再次包含cache-api.h。那可能吗?

我该如何解决这个问题更优雅?假设我想从cache_rd(...)的主存储器中读取,但是在执行SPU的过程中类型会有所不同,我如何在同一个程序中同时使用#define CACHED_TYPE struct x#define CACHED_TYPE struct y

在此先感谢您的答复,我希望我的表达清楚。

+0

如果您想优雅地解决这个问题,请切换到面向对象的语言,并在运行时使用多态性在二者之间进行选择。 – Blindy 2011-05-03 18:34:20

+0

不幸的是我不能这样做,我在单元格中,我使用C – Madrugada 2011-05-03 18:46:19

+1

将你的程序分成不同的文件,并根据文件本地化文件的不同定义。 – 2011-05-03 18:49:58

回答

1

#define#include是预处理器宏:编译之前http://en.wikipedia.org/wiki/C_preprocessor

它们被转换/内联。

要回答你的问题......不,你真的不想这样做,至少为了下一个必须尝试解读这个混乱的人。

+0

这只回答第一个问题,第二个问题是如何更优雅地解决问题。 – Clifford 2011-05-03 19:50:58

+0

但是当我真的需要那么我可以吗? – 2016-12-23 10:39:01

3

#define#include只是在编译的“预处理”阶段发生的文本操作,这在技术上是一个可选阶段。所以你可以以各种方式混合和匹配它们,只要你的预处理器语法正确,它就可以工作。

但是,如果您使用#undef重新定义宏,您的代码将很难遵循,因为相同的文本在代码的不同位置可能有不同的含义。

对于自定义类型typedef,但最好在可能的情况,因为你仍然可以从编译器的类型检查机制中获益,它是不太容易出错,因为它比#define宏不太可能会对周围的意想不到的副作用码。

+0

我认为这是一个问题,因为它将错误指向我的#include 在主函数内,其次是:函数'CACHE_cache_lock'....(更多函数)的无效存储类..我能从中理解什么? – Madrugada 2011-05-03 18:47:06

2

是的,这很好(可能不是最清晰的设计决定),但#include就像该文件复制并粘贴到#include所在的代码中一样。

0

你可以#include任何文件在任何文件。它是否有效取决于文件的内容;特别是如果该内容直接作为文本输入,则该内容是否有效。

头文件通常包含声明和结构,通常只在函数定义之外(或任何类型的编码结构之外)有效 - 线索名称为头文件文件。否则,您可能会更改声明的范围,或者更可能使编译单元在语法上无效。

为此目的专门编写的包含文件可能没有问题,但不是任何任意的头文件。

通用头文件应该包含防护以防止多重声明,因此,除非您取消定义防护宏,否则重新包含头文件在任何情况下都不起作用。

您的问题的一种可能的解决方案是创建单独编译的模块(编译单元)包含包装函数到你需要调用的API。然后,每个编译单元可以在定义适当的配置宏之后包含API头文件。然后你将有两个由这些包装函数提供的独立和独立的接口。