我对声明库中变量的典型方法有何疑问。例如 getopt.h
图书馆。它声明 opterr
和 optarg
以便它们可以在 getopt()
之外使用函数调用;我认为它们可能对这些变量有不同的声明,具体取决于编译器的实现。
我尝试了一些可能的解决方案并在 Windows gcc 中编译了它们(在所有这些解决方案中包括 <getop.h>
):
按照在 .../usr/include/getopt.h 中声明变量的方式声明变量。这在 Windows 中编译时不会抛出警告/错误,但我认为不能保证在其他编译器/操作系统中也会发生同样的事情,而且很可能最终会在编译时抛出错误,所以我认为这种方式不是制作可移植 C 代码的正确方法。
只需以最简单的方式声明变量,如
extern int opterr
和extern char * optarg
.这给了我一个警告“在没有 dll 导入属性的情况下重新声明:以前忽略 dll 导入”(getopt.h 中的变量声明为extern int __declspec(dllimport) opterr
和extern char __declspec(dllimport) *optarg
)。如果变量包含在库( header )中,我的代码中没有变量声明 — 只需使用
#include <getopt.h>
并且没有其他变量声明。 (这不会发出警告。)我几乎可以肯定这将在任何编译器中工作,但对我来说似乎不是最干净的编码方式;我认为变量应该在所有使用它们的文件中声明。
那么,为了编写可移植且干净的代码,您会怎么做呢?
最佳答案
getopt.h
不是库,而是一个头文件。该文件的大部分将是在 DLL 中定义(实现)的函数的声明。该文件似乎还声明了一些变量 opterr
和 optarg
。因此,你的第三项“不声明变量”是正确的,除了通过包含头文件#include "getopt.h"
你实际上是 声明变量。换句话说,头文件的全部意义在于为包含它们的所有编译单元提供正确且一致的函数(和变量)声明。有关示例,请参阅 Include directive 中的目的部分.
关于c - 如何在不丢失属性的情况下声明先前在包含的库中声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25072320/