关于链接脚本中定义以下划线开头的标识符是否符合C标准保留标识符规定的问询
链接脚本中定义以下划线开头的标识符是否符合C标准保留标识符规定?
咱们先结合C标准的具体条款来拆解这个问题:
首先看C标准7.1.3「保留标识符」的核心规定:
所有以下划线开头的标识符,在文件作用域的普通命名空间和标签命名空间中,始终被保留供标准使用。
如果程序在保留标识符的适用上下文(除7.1.4允许的情况外)声明或定义了该标识符,或者将保留标识符定义为宏名称,行为是未定义的。
另外,标准里的补充说明提到:
由于外部标识符和某些以下划线开头的宏名称是保留的,实现可以为这类名称提供特殊语义。例如,标识符
_BUILTIN_abs可用于指示生成abs函数的内联代码。
回到链接脚本的场景:链接脚本里定义的下划线开头的全局符号(外部标识符),其实触碰了标准的保留规则——这类符号属于文件作用域范畴,标准明确保留了所有下划线开头标识符在该作用域的使用权。除非是编译器/链接器明确允许的实现扩展(对应7.1.4的例外情况),否则在链接脚本里定义这类标识符是不符合C标准规定的,会触发未定义行为。
简单总结:没有实现扩展许可的前提下,链接脚本中定义以下划线开头的标识符不符合C标准保留标识符的规定。
备注:内容来源于stack exchange,提问作者Eugene Sh.
相关产品推荐
相关产品推荐

