C 中的 __unused 属性有什么意义?
What's the point of the __unused attribute in C?
我有一个问题。假设您在 C 语言中定义了一个函数或变量。如果您不使用它,编译器会生成一条警告,指出未使用此 variable/function。要抑制警告,请在声明前使用 __unused
属性。如果你必须使用它,那么首先声明 function/variable 有什么意义呢?使用 __unused
有什么好处?
__unused
通常是一个扩展为C语言扩展的宏。不过C23会给我们[[maybe_unused]]
,标准自带例子:
EXAMPLE
[[maybe_unused]] void f([[maybe_unused]] int i) {
[[maybe_unused]] int j = i + 100;
assert(j);
}
Implementations are encouraged not to diagnose that j
is unused, whether or not NDEBUG
is defined.
即assert()
宏在NDEBUG
中会展开为空,也就是说编译器会认为j
没有被使用
当然,另一种方法是将整个 j
定义(以及可选的用法)放在 #ifdef
“块”中,但在这种情况下会很麻烦。此外,如果你这样做,那么 i
将是未使用的,等等
还有其他用例,例如未使用的函数参数,如果您想保留它们的名称并避免 (void)x;
技巧,在某些情况下处理混乱的 optimizer/compiler,符号的外部使用不能被compiler/linker等
看到
我有一个问题。假设您在 C 语言中定义了一个函数或变量。如果您不使用它,编译器会生成一条警告,指出未使用此 variable/function。要抑制警告,请在声明前使用 __unused
属性。如果你必须使用它,那么首先声明 function/variable 有什么意义呢?使用 __unused
有什么好处?
__unused
通常是一个扩展为C语言扩展的宏。不过C23会给我们[[maybe_unused]]
,标准自带例子:
EXAMPLE
[[maybe_unused]] void f([[maybe_unused]] int i) { [[maybe_unused]] int j = i + 100; assert(j); }
Implementations are encouraged not to diagnose that
j
is unused, whether or notNDEBUG
is defined.
即assert()
宏在NDEBUG
中会展开为空,也就是说编译器会认为j
没有被使用
当然,另一种方法是将整个 j
定义(以及可选的用法)放在 #ifdef
“块”中,但在这种情况下会很麻烦。此外,如果你这样做,那么 i
将是未使用的,等等
还有其他用例,例如未使用的函数参数,如果您想保留它们的名称并避免 (void)x;
技巧,在某些情况下处理混乱的 optimizer/compiler,符号的外部使用不能被compiler/linker等