- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 Open Watcom C 编译器(而非 C++)执行 #define NORETURN(x)
宏?
基于 the fine manual我有这个文件test.c
:
#include <stdlib.h>
#ifdef __GNUC__
#define STATIC_NORETURN(sig) static void sig __attribute__((__noreturn__))
#define EXTERN_NORETURN(sig) extern void sig __attribute__((__noreturn__))
#endif
#ifdef __WATCOMC__
#pragma aux noreturn aborts;
#define STATIC_NORETURN(sig) static void __pragma("noreturn") sig
#define EXTERN_NORETURN(sig) extern void __pragma("noreturn") sig
#endif
STATIC_NORETURN(my_static_example(void));
EXTERN_NORETURN(my_extern_example(void));
static void my_static_example(void) {
exit(0);
}
void my_extern_example(void) {
my_static_example();
}
它使用 GCC 编译时没有任何错误或警告:
$ gcc -Wall -Wextra -pedantic -std=gnu99 -c test.c
但不使用 Open Watcom 1.9:
$ wine wcc386 -q -wx test.c
test.c(14): Error! E1009: Expecting ')' but found 'noreturn'
test.c(14): Error! E1026: Invalid declarator
test.c(14): Error! E1009: Expecting ',' but found 'noreturn'
test.c(14): Error! E1026: Invalid declarator
test.c(14): Error! E1009: Expecting ',' but found ')'
test.c(14): Error! E1024: Declared symbol 'my_static_example' is not in parameter list
test.c(15): Error! E1023: Storage class of parameter must be register or unspecified
test.c(15): Error! E1009: Expecting ')' but found 'noreturn'
test.c(15): Error! E1024: Declared symbol '__pragma' is not in parameter list
test.c(15): Error! E1009: Expecting ',' but found 'noreturn'
test.c(15): Error! E1026: Invalid declarator
test.c(15): Error! E1009: Expecting ',' but found ')'
test.c(15): Error! E1024: Declared symbol 'my_extern_example' is not in parameter list
test.c(17): Error! E1023: Storage class of parameter must be register or unspecified
test.c(17): Error! E1024: Declared symbol 'my_static_example' is not in parameter list
test.c(17): Error! E1076: Missing semicolon at end of declaration
test.c(22): Warning! W131: No prototype found for function 'my_static_example'
test.c(14): Warning! W202: Symbol '__pragma' has been defined, but not referenced
仔细阅读后,我认为手册说 __pragma
出于某种原因只能在 C++ 代码中工作。但我不确定我是否理解正确。是否有不需要在每个函数定义处使用 #pragma
的 C 等效项?我试图避免使用 ifdef,所以最好在一个中心位置定义一个可移植的 NORETURN 宏。
最佳答案
阅读 https://open-watcom.github.io/open-watcom-v2-wikidocs/cguide.html它是:
__declspec( noreturn )
indicates to the C/C++ compiler that function does not return.
Example:
...
兼容stdnoreturn.h ,别想出自己的风格。做:
// possibly in some noreturn.h
// maybe even name it stdnoreturn.h
#if __STDC_VERSION__ >= 201110L
#include <stdnoreturn.h>
#elif defined(__WATCOMC__)
#define noreturn __declspec(noreturn)
#else
#error
#endif
#include <stdlib.h>
static noreturn void my_static_example(void) {
exit(0);
}
noreturn void my_extern_example(void) {
my_static_example();
}
在 wcc386 -q -wx test.c
上使用 2.0 版
编译良好。
关于c - 如何在 Watcom C 中定义 NORETURN 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57540145/
搜索有关 Open Watcom 链接器、内联汇编和 C 编译器的手册和文档,因为我发现官方手册不够好。 我特别关注 C 和汇编。 感谢您提供指向教程、书籍等的链接。 最佳答案 回到过去,Watcom
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我有一些代码可以写入和读取 VGA 的 I/O 端口。我正在尝试在内联汇编器中实现工作 C 代码功能。我正在使用 Open Watcom 2.0 并针对 DOS 16 位进行编译。 为了写入 VGA
如何让 Watcom 编译器(在 64 位主机上运行的分支版本 2.0 beta)在 ASM 文件中输出 8086 汇编源代码?从命令提示符运行 wcc -0 main.c 只生成 OBJ 文件。 附
一个普遍的问题。 我正在为 Sybase SQL Anywhere 10 开发。出于向后兼容性的原因,我们几乎所有的存储过程都是用 Transact-SQL 编写的。 使用 T-SQL 代替 Watc
我得到了一个遗留的fortan IV程序,该程序需要为一个遗留的编程语言类进行编译,并且被指示使用http://www.openwatcom.org/index.php/Downloads中的Watc
我在NASM中编写了一个引导加载程序,它将64kb的程序数据从磁盘加载到内存中,从地址0060:0000 [SEG:OFF]开始。我通过在程序集(NASM)中编写一些代码并将其放入磁盘来测试了我的项目
我使用的是Open Watcom IDE V1.9,目标环境是DOS-16bit,镜像类型是exe。 objective-c pu 是 80386。 这是我的源代码: #include void g
是否可以使用 Open Watcom C 编译器(而非 C++)执行 #define NORETURN(x) 宏? 基于 the fine manual我有这个文件test.c: #include
我在我的操作系统 Win XP 上安装了编译器“Open watcom”,我在 Virtual Box 下运行该操作系统。 我以自动模式安装了程序:完整包,并自动更改自动执行和配置文件,其中环境变量所
今天,我了解到 MASM 中的 SEG 运算符默认返回 GROUP 的地址而不是相关表达式的 SEGMENT 的地址,并且有一些选项和方法可以覆盖它。 由于我目前在 Open Watcom 1.9/1
我正在尝试生成 16 位 DOS 可执行文件,但使用的是 gcc 编译器。所以我使用的是古老的 gcc-4.3 ia16 端口。我制作了我的构建的 Docker 镜像:https://registry
我有一个具有以下声明样式的 header : extern struct xvimage *allocimage(char * name, int32_t rs, int32_t cs, int32_
我需要生成一个远跳转指令来跳转到另一个ISR(中断服务例程)。我正在开发一个 32 位 FreeDOS 应用程序。 阅读 OW 手册( cguide.pdf 和 clr.pdf )后,我找到了两种成功
对于此 C 源代码: int add(int a, int b) { return a + b; } ,用于 8086 的 Watcom C 编译器 (wcc -s -ms -os -0 prog.c
我想通过 Watcom C 编译器 生成一个 16 位可执行 BINARY RAW 格式。类似于在实模式下运行的没有任何 header 的 EXE 文件。 我使用Large内存模型,因此代码段和数据段
使用 Windows 7、Matlab R2011a(32 位)和 Open Watcom 1.8 版,我正在尝试编译调用 Fortran 代码的 C MEX 文件。 按照 Matlab 网站 (su
我是一名优秀的程序员,十分优秀!