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编写的部分。其他任何内容都超出了其范围。请阅读: