【问题标题】:Defining a Function in C用 C 定义函数
【发布时间】:2011-07-05 04:41:58
【问题描述】:

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

直到现在我还以为函数总是被定义为:

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

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

TIDY_EXPORT int TIDY_CALL         tidyDetectedHtmlVersion( TidyDoc tdoc );

哪个更a:

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”在做什么呢?

【问题讨论】:

    标签: c


    【解决方案1】:

    TIDY_EXPORT int TIDY_CALL 只是你的函数的修饰符。

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

    TIDY_EXPORTplatform.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?

    【讨论】:

    • 宏有多个平台特定的定义。查看@dan04的回答
    【解决方案2】:

    TIDY_EXPORT 在 Windows 上被 #定义为 __declspec(dllexport),以便在 Tidy 编译为 DLL 时允许导出函数。

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

    这两个特性都是对 C 语言的非标准扩展(这就是为什么它们被抽象为条件编译宏的原因)。

    【讨论】:

      【解决方案3】:

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

      包含的文件:

      #include "platform.h"
      

      which you can read here,定义宏。

      有关宏的更多信息,read this

      【讨论】:

        【解决方案4】:

        在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 
        

        【讨论】:

          【解决方案5】:

          它们是宏,你可以在源代码的某个地方找到它们。例如 TIDY_CALL 在 platform.h 中

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

          【讨论】:

            【解决方案6】:
            【解决方案7】:

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

            【讨论】:

            • +1 令人惊讶的是,很少有人费心去真正找到他们的定义位置
            【解决方案8】:

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

            【讨论】:

            • 看看 Oleg 的回复:他为你完成了这项工作;)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-14
            • 1970-01-01
            • 1970-01-01
            • 2011-05-07
            • 2019-05-17
            相关资源
            最近更新 更多