我想知道C中的main()
函数是否可能包含某些内容。
例如,在一个Cell程序中,我定义了后面在我想要改变的main()
函数中的cache-api.h的参数。
我理解用#define
定义的内容可以在程序中的任何位置使用#undef
取消定义,但在重新定义我需要的参数后,我必须再次包含cache-api.h。这可能吗?
如何才能更优雅地解决这个问题?假设我想使用cache_rd(...)
从主存储中读取,但在执行SPU期间类型会有所不同,我如何在同一程序中同时使用#define CACHED_TYPE struct x
和#define CACHED_TYPE struct y
?
在此先感谢您的回答,我希望我能表达清楚。
答案 0 :(得分:3)
#define
和#include
只是在编译的“预处理”阶段发生的文本操作,从技术上讲,这是一个可选阶段。因此,您可以通过各种方式混合和匹配它们,只要您的预处理器语法正确,它就可以工作。
但是,如果您使用#undef
重新定义宏,则代码将难以遵循,因为相同的文本在代码中的不同位置可能具有不同的含义。
对于自定义类型typedef
在可能的情况下是首选,因为您仍然可以从编译器的类型检查机制中受益,并且它不易出错,因为它比#define
宏的可能性小得多。对周围的代码有意想不到的副作用。
答案 1 :(得分:2)
是的,这很好(可能不是最明确的设计决定),但#include就像将该文件复制并粘贴到#include所在的代码中一样。
答案 2 :(得分:1)
#define
和#include
是预处理器宏:http://en.wikipedia.org/wiki/C_preprocessor
在编译之前转换/内联它们。
回答你的问题......不,你真的不想这样做,至少是为了下一个必须尝试解读这个烂摊子的人。
答案 3 :(得分:0)
您可以在任何文件中#include
任何文件。它是否有效取决于文件的内容;具体而言,如果该内容直接作为文本输入,该内容是否有效。
头文件通常包含通常仅在函数定义之外(或在任何类型的编码构造之外)有效的声明和构造 - 线索在名称 header 文件中。否则,您可能会更改声明的范围,或者更多地表示编译单元在语法上无效。
专门为此目的编写的包含文件可能没问题,但不仅仅是任意头文件。
通用头文件应该包含防止多重声明的防护,因此除非你取消定义防护宏,否则重新包含头文件在任何情况下都不起作用。
您的问题的一个可能的解决方案是创建单独编译的模块(编译单元),其中包含您需要调用的API的包装函数。然后,每个编译单元在定义适当的配置宏之后可以包括API头文件。然后,您将拥有这些包装函数提供的两个独立且独立的接口。