2016-11-25 107 views
-1

我不确定以下是C标准中的错误,GCC中的错误还是我误解的一些奇怪行为,但以下内容抱怨foo的隐式声明:内联函数调用静态内联函数

static inline void foo(void); 

inline void bar(void) { 
    foo(); 
} 

有什么想法?谢谢。

注意:如果你想正确的答案,搜索我的而不是其他的,而不是投票。

+3

你可以发布确切的投诉 – sas

+1

你也使用foo(),但从来没有定义。 – sas

+0

我确实发布了确切的投诉:使用隐式*声明*而不是提供的。定义与此事无关,这就是为什么我没有提供。如果我提供了一个,它仍然没有使用。无论如何,我已经回答了这个问题。 –

回答

1

您正在声明foo,但从未定义它。我得到的错误是inline function ‘void foo()’ used but never defined,它完全告诉你。

+0

我没有足够解释的警告是:'警告:'foo'是静态的,但用于不是静态的内联函数'bar'中。我假设你不能在非静态函数中使用静态函数,但为什么?范围规则? – Chirality

+0

我只是没有在该片段中定义它。但正如你所看到的,它试图使用隐式声明,所以这不是问题。我已经在下面提供了答案。 –

1

没关系,我找到了正确答案。

即使代码具有逻辑意义的单个翻译单元的情况下,标准似乎明确地禁止这个角落的情况下(这将会是不好的做法,无论如何,因为重构可能,如果导致问题酒吧被移到单独的TU ---因为foo不会是bar的TU范围)。

C11的§6.7.4p3说:

具有外部链接的功能的内联定义不应含有与静态或线程存储持续时间的修改的对象的一个​​定义,并且将不包含一个参考标识符与内部链接。