繁体   English   中英

可以单独编译任何.c文件(也就是说,没有main?)

[英]Possible to compile any .c file in isolation (that is, without a main?)

我目前有一个“类似库”的.c文件(将在下面显示)。 我有2个问题:

  1. 如果我想看看它是否能很好地编译,我该怎么办呢? 如果我尝试gcc它,它将始终给出一个“无主”错误,这是有道理的,但提出了一个问题,即知道给定的.c文件是否能在“隔离”中编译好。 我可以安全地得出结论,如果编译器引发的唯一错误是“无主”,我的文件没问题吗? 在这里单独编译.c文件可能很好的一个例子就是确定哪些包含过多。

  2. 在像这样的简单文件中是否有一个点用它的方法/结构声明定义一个标题,然后有一个带有代码实现的微小的.c文件?

     #ifndef SEMAFOROS #define SEMAFOROS #include <signal.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <semaphore.h> typedef struct { sem_t* id; char* nome; } Semaforo; inline void lock(Semaforo* semaforo) { sem_wait(semaforo->id); } inline void unlock(Semaforo* semaforo) { sem_post(semaforo->id); } Semaforo* criarSemaforo(char* nome) { Semaforo* semaforo = (Semaforo*)malloc(sizeof(Semaforo)); semaforo->id = sem_open(nome, O_CREAT, 0xFFFFFFF, 1); semaforo->nome = nome; } void destruirSemaforo(Semaforo* semaforo) { sem_close(semaforo->id); sem_unlink(semaforo->nome); 
     free(semaforo); 
    \n\n }\n\n\n #万一\n

谢谢

在没有链接的情况下编译它(不需要主入口点):

cc -c file.c -o file.o

即使对于定义将从其他源文件调用的例程的小文件,您仍然需要头文件。 头文件是编译器在链接器将它们连接在一起之前知道例程的接口的方式。 如果您没有外部函数的声明,则编译器必须对参数的数据类型进行假设(通常是错误的)。 您可以在每个使用它们的源文件中声明函数,但是头文件的位置是您只需在头文件中执行一次。

gcc的-c选项似乎是您所缺少的,它将一个.c文件编译为.o文件。

你的第二个问题的答案是'确定'。 这是一个很好的习惯,不要在所有想要使用某个共享功能的.c文件中输入externs。 每一点.h都有帮助。

对于第二个问题,我想知道为什么!

要回答第2点,在头文件中保留声明可以帮助您避免以下情况。

您决定需要在file.c跟踪您的鸡:

int number_of_chickens;

file2.c ,您决定将鸡的数量表示为double而不是int,这是一个好主意,但是您忘记更新file.c

extern double number_of_chickens;
double count_chickens() {
    return number_of_chickens;
}

void add_to_chickens(double how_many) {
    number_of_chickens += how_many;
}

这将编译得很好。 链接器将number_of_chickens视为引用file.c的4位int的名称,以及file2.c的8位double。

如果你调用count_chickens函数,它将返回垃圾(double的高32位将用int number_of_chickens的内容填充,低32位将是未定义的 - 无论内存中的number_of_chickens之后是什么)。

更糟糕的是,当你在file2.c调用add_to_chickens(1)时,你会将8个字节写入4字节的存储位置,肯定会造成严重破坏,但不一定会导致运行时错误(至少不会立即引起)。

如果将外部声明保留在公共头文件中,则会立即收到编译时错误。 如果不这样做,则在发货3个月后会出现无法解释的不稳定因素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM