#ifndef QUEUE_H#define QUEUE_H#include <stdbool.h>#include <stddef.h>struct queue { struct cell* first; struct cell* last;};typedef struct queue queue;extern queue newQueue(voID);extern bool isEmpty(queue);extern queue enqueue(queue,voID*);extern queue dequeue(queue);extern voID* front(queue);extern voID freeQueue(queue);
由于其中两个(newQueue和isEmpty)非常简单,我相信编译器可以用它们做很多好的优化,我决定为它们编写内联声明:
/* replacing the two linesextern queue newQueue(voID);extern bool isEmpty(queue);in the original header */extern inline queue newQueue(voID) { queue q = { NulL,NulL }; return q;}extern inline bool isEmpty(queue q) { return q.first == NulL;}
用gcc编译好.但是当我用clang编译它时,它给了我一个错误.一项快速研究表明,从GNU风格做这些内联声明的官方方式是is different.我可以传递-std = gnu89或根据上面的链接更改功能签名.我选择了第二个选项:
inline queue newQueue(voID) { queue q = { NulL,NulL }; return q;}inline bool isEmpty(queue q) { return q.first == NulL;}
但是现在,当以c99模式编译时,clang和gcc都会说一些关于重复函数声明的内容.这是queue.c中的附带定义:
#include "queue.h"/* ... */queue newQueue() { queue q = { NulL,NulL }; return q;}bool isEmpty(queue q) { return q.first == NulL;}
我究竟做错了什么?如何在不需要切换到gnu89模式的情况下获得我想要的内容?
这些是我用第二种风格得到的错误消息:
$gcc -std=c99 queue.c queue.c:12:7: error: redeFinition of ‘newQueue’queue.h:14:21: note: prevIoUs deFinition of ‘newQueue’ was herequeue.c:17:6: error: redeFinition of ‘isEmpty’queue.h:19:20: note: prevIoUs deFinition of ‘isEmpty’ was here$clang -std=c99 queue.cqueue.c:12:7: error: redeFinition of 'newQueue'queue newQueue() { ^In file included from queue.c:5:./queue.h:14:21: note: prevIoUs deFinition is hereextern inline queue newQueue(voID) { ^queue.c:17:6: error: redeFinition of 'isEmpty'bool isEmpty(queue q) { ^In file included from queue.c:5:./queue.h:19:20: note: prevIoUs deFinition is hereextern inline bool isEmpty(queue q) { ^2 errors generated.解决方法 如果要在头文件中定义函数,请将它们设为静态.这应该足以让编译器内联它们(内联只是一个额外的提示).
如果在整个程序中包含多个标题,则标题中的非静态函数将导致多个定义.
我做了一些研究并获得了更多信息:
您可以使用内联方式.至少在C99.您不能在queue.c中同时拥有内联和非内联定义.您需要在#ifdef中包装内联定义或将它们移动到queue.c中不包含的头文件中.
您需要编写两次函数并使用预处理器,但它应该完全按照您的意愿工作.当函数未内联时,它只会被发出一次.
总结以上是内存溢出为你收集整理的关于C中内联声明的困惑全部内容,希望文章能够帮你解决关于C中内联声明的困惑所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)