C99标准对此有明确定义吗?
我通过定义C99标准对此有明确定义吗?,c,C,我通过定义main使链接器很高兴,即使我的程序中没有main函数。这是否符合C99标准 void foo() { __asm__ (".globl main\n\n" "main:\n" "\txorl %eax, %eax\n" "\tret"); } 不,C标准没有定义任何内联程序集的行为。C中没有\uuu asm\uuu关键字,因此使用未在C中定义的关键字这一简单事实意味着您的程序没有严格的一致性。一个实现可以提供\uu asm\u
main
使链接器很高兴,即使我的程序中没有main
函数。这是否符合C99标准
void foo()
{
__asm__ (".globl main\n\n"
"main:\n"
"\txorl %eax, %eax\n"
"\tret");
}
不,C标准没有定义任何内联程序集的行为。C中没有
\uuu asm\uuu
关键字,因此使用未在C中定义的关键字这一简单事实意味着您的程序没有严格的一致性。一个实现可以提供\uu asm\uu
关键字,但只能作为扩展。特别是,C99标准在信息性(非规范性)章节J.5.10中列出了asm关键字:
asm
关键字可用于将汇编语言直接插入到
翻译输出(6.8)。最常见的实现是通过
表格说明:asm(字符串文字)代码>
准确地说,您的程序不是严格符合要求的。根据§4/p5合规性(重点):
严格一致的程序应仅使用
本国际标准中规定的语言和库。2)
查看内联程序集构造的前缀是如何加上双下划线的(\uuu
)?这意味着它不是标准的C语言或库功能,因此您的程序不是“有效的”C99程序。更一般地说,标准是否关心在托管环境中如何提供main
?如果没有main
函数,并且不知何故我提供了一个main
符号,它仍然是一个定义良好的程序吗?@Dai:正确的结论,但不正确的推理。有些标识符以双下划线开头,由C99标准(以及当前的C11标准)定义。示例包括\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu行
,以及\uuuuu<代码>\uuuu asm\uuuu
恰好不是其中之一。您可以用任何语言编写main
,或程序中的任何其他函数。C标准仅适用于用C编写的部分。其他任何内容都超出了其范围。请阅读: