This attribute tells the compiler that the function won't ever return, and this can be used to suppress errors about code paths not being reached. The C library functions abort() and exit() are both declared with this attribute:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));
Once tagged this way, the compiler can keep track of paths through the code and suppress errors that won't ever happen due to the flow of control never returning after the function call.
In this example, two nearly-identical C source files refer to an "exitnow()" function that never returns, but without the __attribute__ tag, the compiler issues a warning. The compiler is correct here, because it has no way of knowing that control doesn't return.
$ cat test1.c
extern void exitnow();
int foo(int n)
{
if ( n > 0 )
{
exitnow();
/* control never reaches this point */
}
else
return 0;
}
$ cc -c -Wall test1.c
test1.c: In function `foo':
test1.c:9: warning: this function may return with or without a value
But when we add __attribute__, the compiler suppresses the spurious warning:
$ cat test2.c
extern void exitnow() __attribute__((noreturn));
int foo(int n)
{
if ( n > 0 )
exitnow();
else
return 0;
}
$ cc -c -Wall test2.c
no warnings!
分享到:
相关推荐
`__attribute__((noreturn))`属性用于标记那些不会返回到调用者的函数,如`exit`和`abort`。这可以帮助编译器进行优化,例如跳过一些不必要的清理工作。 **示例**: ```c extern void exit(int) __attribute__((no...
GNU CC 是一种基于 GCC(GNU ...此外,除了`format`属性,还有其他许多可用的函数属性,如`noreturn`(表示函数不会返回)、`malloc`(表示函数返回的内存需要手动释放)等,它们都能帮助编写更安全、更高效的C代码。
例如,使用 __attribute__((availability(macosx,introduced=10.4,deprecated=10.6))) 指令可以指定函数的可用性信息,而使用 __attribute__((noreturn, format(printf, 1, 2))) 指令可以指定函数的返回性质和格式...
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") def __setattr__(self, name, value): if name == "__private_attribute": self._MyClass__private_attribute = ...
例如,开发者可以使用__attribute__来指定某个函数不会返回(noreturn),以此告诉编译器,避免发出不必要的警告,从而使得代码更加清晰。 文档还提到了关于版本发布的信息,ARM Compiler v5.06 for µVision是在...
return self.some_class.some_attribute ``` ##### 4. 使用继承 如果多个类都需要使用相同的属性或方法,可以考虑创建一个基类,并让其他类继承它。 ```python class BaseClass: def hover(self): print(...
return ERROR_NO_DEVICE; } } else { memset(&stLFD,0,sizeof(stLFD)); if(!FindNextFile(hFile,&stLFD) || hFile == 0) { break; } } if(stLFD.dwFileAttributes != (FILE_...
例如,`__attribute__((__noreturn__))`标记可以告诉编译器某个函数不会返回,这样编译器就能优化掉函数返回后的代码。另外,`__attribute__((__const__))`可以标记常量函数(pure function),表示函数对于相同的...
3. `__attribute__((noreturn))`: 标记一个函数不会返回,如`exit()`函数。 4. `__attribute__((nodiscard))`: 提示编译器发出警告,如果忽略返回值。 5. `__attribute__((deprecated))`: 标记过时的函数或类型,...
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") def __setattr__(self, name, value): if name == 'private_var': self.__private_var = value else: super().__...
(Type Attributes)**:GNU C允许在声明中添加类型属性,如`__attribute__((aligned))`用于指定对齐要求,`__attribute__((malloc))`用于表示函数返回的新分配内存,还有`__attribute__((noreturn))`声明函数不会返回...
ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...
(c) A component attribute can be a composite attribute. (d) A component attribute always contains other components. Correct answer is (c) 3. In the Entity-Relationship model, properties that ...
ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...
extern void pthread_exit(void *__retval) __attribute__((__noreturn__)); ``` - 参数 `__retval` 是线程的退出状态,如果其他线程调用了 `pthread_join` 并且提供了非 `NULL` 的 `__thread_return`,那么这个...
- **DOM模型**: 库中的`xml_node`和`xml_attribute`类代表XML节点和属性,提供了一系列API用于访问和修改XML结构。 - **序列化**: 可以将内存中的DOM树写回XML文件或字符串,保持原始格式或进行压缩。 - **内存...
* static void __attribute__((no_instrument_function))init_once(void) { pthread_key_create(&sBackTraceKey, destructor);} * 初始化 thread_stack_t 放入 TLS 中:get_backtrace_info() { thread_stack_t* ptr ...
return img def generate_arrays_from_file(x_y): global count batch_size = 32 # 指定批量大小 while True: x_batch = [] y_batch = [] for i in range(batch_size): # 从x_y中随机选择一个样本 sample ...
dcbSerialParams.Parity = NOPARITY; // 无奇偶校验 SetCommState(hComm, &dcbSerialParams); // 清除缓冲区 PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); // 发送数据 const char* send_data = ...