在C中定义函数

时间:2011-02-27 10:26:59

标签: c

我是C的新手,可能有一个n00b问题...

到目前为止,我认为函数始终定义为:

return_type function_name(function_arg_1 type, function_arg_1_name, ...)

但是现在我找到了一个C头文件,其函数看起来像这样:

TIDY_EXPORT int TIDY_CALL         tidyDetectedHtmlVersion( TidyDoc tdoc );

更多的是:

i_do_not_know return_type i_do_not_know function_name(function_arg_1 type, function_arg_1_name)

可以在http://tidy.sourceforge.net/docs/api/tidy_8h-source.html

看到整个来源

那么“TIDY_EXPORT”和“TIDY_CALL”在做什么?

8 个答案:

答案 0 :(得分:3)

TIDY_EXPORT int TIDY_CALL只是你功能的修饰符。

函数名称为tidyDetectedHtmlVersion,它采用tdoc类型的一个参数(TidyDoc)并返回int

TIDY_EXPORT是在platform.h文件中定义的宏,定义为

00492 #if defined(_WIN32)
00493 
00494 #if (defined(_USRDLL) || defined(_WINDLL)) && !defined(TIDY_EXPORT)
00495 #define TIDY_EXPORT __declspec( dllexport ) 
00496 #endif

允许您在将文件编译为库(例如dll)时导出函数

至于TIDY_CALL,它在同一个文件中定义为:

00498 #ifndef TIDY_CALL
00499 #ifdef _WIN64
00500 #  define TIDY_CALL __fastcall
00501 #else
00502 #  define TIDY_CALL __stdcall
00503 #endif
00504 #endif

请参阅此问题以获取解释What is __stdcall?

答案 1 :(得分:2)

TIDY_EXPORT和TIDY_CALL是宏。它们在platform.h中定义。

答案 2 :(得分:2)

在platform.h中你有

#if (defined(_USRDLL) || defined(_WINDLL)) && !defined(TIDY_EXPORT)
#define TIDY_EXPORT __declspec( dllexport )
#endif

#ifndef TIDY_CALL
#ifdef _WIN64
#define TIDY_CALL __fastcall
#else
# define TIDY_CALL __stdcall
#endif
#endif 

答案 3 :(得分:2)

C很简单......直到宏参与其中! ALL CAPS中的任何内容都可能是一个宏,这是一个在编译之前被其他文本替换的符号。该文本可以定义为任何内容,包括空字符串。幸运的是Doxygen已被使用,因此您可以查看文档http://tidy.sourceforge.net/docs/api/tidy_8h.html

包含的文件:

#include "platform.h"

which you can read here,定义宏。

有关宏的所有荣耀的更多信息,read this

答案 4 :(得分:1)

在Windows上,

TIDY_EXPORT #defined为__declspec(dllexport),以便在将Tidy编译为DLL时允许导出该函数。

TIDY_CALL是一个扩展为特定于平台的calling convention的宏。

这两个功能都是C语言的非标准扩展(这就是为什么它们是在有条件编译的宏后面抽象出来的。)

答案 5 :(得分:0)

它们是您的库中的一些宏定义。在所有文件中进行文本搜索,您可能会找到他们确切定义的内容。通过使用一些超自然的诊断策略,我猜TIDY导出是从库中导出函数的一些装饰(即MS编译器中的declspec(dllexport),而TIDY_CALL指定调用约定(即stdcall,pascal等)

答案 6 :(得分:0)

答案 7 :(得分:0)

它们是宏,您可以在某处的源代码中找到它们。例如TIDY_CALL在platform.h中

 #ifndef TIDY_CALL
 #ifdef _WIN64
 #  define TIDY_CALL __fastcall
 #else
 #  define TIDY_CALL __stdcall
 #endif
 #endif