标签、函数的命名约定



我有点困惑,仍然没有找到明确的答案:我应该将标签命名为"label1"还是带下划线"_label1"?最受欢迎和认可的方式是什么?如果我没记错的话,我甚至见过一个带点".label1"的。

函数也有同样的问题:"function1"还是"_function1"?

从代码可维护性的角度来看,前导点和下划线不会向标签添加任何有用的信息,因此如果不需要这些前缀(见下文),则应该去掉它们。仅仅是你可能认为"它看起来很花哨"这一事实并不是使用它们的充分理由。

汇编程序有时使用点来指定标签是本地,即不作为符号导出到对象文件。这对于避免使用不需要的符号污染全局名称空间非常有用。

其他汇编器使用点来表示汇编器指令,并且根本不允许在符号中使用点。

Undercore通常由必须与高级语言集成的汇编代码使用。一些C编译器在所有导出的符号前面加下划线,为了能够从C代码中调用,汇编函数需要遵循这一规则。

一般来说,您的汇编程序(和/或编译器,如果您与已编译代码集成的话)手册应该能够告诉您特定的汇编程序支持或需要什么变体。如果手册没有明确告诉你何时以及为什么应该使用这样的前缀,那就不要使用它们——汇编程序标签是自我记录代码的一个(最小也是最重要的)部分。如果你不需要的话,不要把它浪费在毫无意义的前缀上

在Microsoft的情况下"C";函数,实际的函数名称将有一个前导下划线。对于32位模式汇编,请在.model指令中包含语言类型:

.model  flat,c      ;for 32 bit mode only, no underscores needed

这样就不需要在函数名中使用下划线。在64位模式中,.model指令似乎不被允许,但它似乎默认为.model flat,c。

附带说明一下,Visual Studio 2015及更高版本默认为";内联";printf(和其他一些东西)在C源文件中。有一个遗留版本可以从程序集代码中使用。示例包括lib语句。

includelib      msvcrtd
includelib      oldnames
includelib      legacy_stdio_definitions        ;for printf