DLL __attribute__

DLL attribute 详解

The #define TC_DLL attribute((visibility("default"))) macro is used in C/C++ code to control symbol visibility when compiling shared libraries (DLLs on Windows or .so files on Unix-like systems).

Explanation:

1. attribute((visibility("default"))):

This is a GCC/Clang compiler attribute that explicitly marks a symbol (function, class, variable, etc.) as "visible" outside the shared library.
Symbols with visibility("default") will be exported and can be linked against by other programs or libraries.
Conversely, visibility("hidden") hides the symbol, making it internal to the library (improves optimization and reduces symbol collisions).

2. Purpose of TC_DLL:

The macro TC_DLL is a shorthand for this attribute, making the code cleaner and more portable.
When you annotate a symbol with TC_DLL, it ensures the symbol is exported in the shared library.

Example Usage:

// Export this function in the shared library
TC_DLL void my_public_function() {
    // ...
}

// This function is NOT exported (hidden by default)
void my_internal_function() {
    // ...
}

Cross-Platform Compatibility:

On Windows, you might see similar functionality using __declspec(dllexport):

#ifdef _WIN32
  #define TC_DLL __declspec(dllexport)
#else
  #define TC_DLL __attribute__((visibility("default")))
#endif

This ensures the macro works across different platforms.

Why Use It?

Explicitly controlling symbol visibility helps:
Reduce library size by hiding unnecessary symbols.
Avoid symbol clashes between libraries.
Improve load times (fewer symbols to resolve).
If you're working on a shared library, this macro is likely used to mark which symbols should be exposed to users of the library.


TC_DLL 宏

定义:

#define TC_DLL __attribute__((visibility("default")))

解释:

__attribute__ :这是 GCC 编译器的一个扩展,用于在代码中添加特定的属性或指令。

visibility("default") `:这个属性用于控制符号的可见性。默认情况下,符号在共享库中是不可见的,使用 visibility("default") 可以将符号标记为默认可见,允许外部访问。

作用:

控制符号可见性:通过设置符号的可见性,可以在共享库中导出特定的函数或变量,使其对其他模块或程序可见。

简化导出过程:定义 TC_DLL 宏后,可以在项目中轻松地导出函数或变量,而无需在每个函数或变量前重复编写 attribute((visibility("default")))。

示例:

假设有一个函数需要在共享库中导出:

TC_DLL void myExportedFunction() {
    // 函数体
}

在这个例子中,myExportedFunction 函数被标记为默认可见,可以在外部访问。

使用场景:

共享库开发:在开发共享库(如动态链接库,DLL)时,使用 TC_DLL 宏可以方便地导出函数或变量,供其他模块使用。

跨平台开发:虽然 attribute 是 GCC 的扩展,但在支持该扩展的其他编译器(如 Clang)中,TC_DLL 宏仍然有效,适用于跨平台开发。

TC_THROW_EXCEPTION 宏

定义:

#define TC_THROW_EXCEPTION noexcept(false)

解释:

noexcept 关键字:在 C++ 中,noexcept 用于指示函数不会抛出异常。如果函数确实抛出异常,编译器会报错。

noexcept(false):与 noexcept 相反,noexcept(false) 表示函数会抛出异常。这通常用于模板元编程或需要动态确定异常规范的场景。

作用:

强制抛出异常:通过定义 TC_THROW_EXCEPTION 宏,可以在函数中强制抛出异常,确保函数的行为符合预期。

提高代码可读性:将 noexcept(false) 定义为一个宏,可以使代码更简洁,提高可读性。

示例:

假设有一个函数需要抛出异常:

void myFunction() TC_THROW_EXCEPTION {
    // 函数体
    throw std::runtime_error("An error occurred");
}

在这个例子中,myFunction 函数被明确指示会抛出异常,编译器会允许该函数抛出异常。

使用场景:

模板函数:在模板函数中,可能需要根据条件动态决定是否抛出异常。TC_THROW_EXCEPTION 宏可以简化这种条件编译。

异常处理:在需要明确抛出异常的函数中,使用该宏可以提高代码的清晰度和可维护性。

总结
通过详细解释 TC_THROW_EXCEPTION 和 TC_DLL 宏,可以看出它们在项目中的重要作用:

TC_THROW_EXCEPTION:

用于指示函数会抛出异常,确保函数行为符合预期。
提高代码的可读性和可维护性,特别是在模板函数和异常处理中。

TC_DLL:

用于控制符号的可见性,简化共享库中函数和变量的导出过程。
在共享库开发和跨平台开发中特别有用,提升项目的灵活性和可维护性。
这两个宏通过简洁的定义,为开发者提供了强大的功能,帮助管理函数的异常行为和符号的可见性,是项目中不可或缺的工具。

posted @ 2025-04-23 18:05  michaelchengjl  阅读(20)  评论(0)    收藏  举报