【问题标题】:gcc doesn't warn about calling a nullary function WITH parameters?gcc 没有警告调用带参数的空函数?
【发布时间】:2011-03-27 18:48:42
【问题描述】:

谁能告诉我,为什么在 blazes 中 GCC(例如 4.4.3)没有警告或错误调用空函数的错误?

void hello() {
}

int main( int argc, char* argv[] ) {
 int test = 1234;
 hello(test);

 return 0;
}

(另见http://bytes.com/topic/c/answers/893146-gcc-doesnt-warn-about-calling-nullary-function-parameters

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    因为:

    void hello() {
    

    并不意味着你认为它会做什么。使用:

    void hello( void ) {
    

    如果没有 void,您就是说您不必费心指定参数。请注意,这是 C 与 C++ 的众多不同之处之一。

    【讨论】:

      【解决方案2】:

      在 C 中,void hello() 声明了一个函数 hello(),它返回一个 void 并接受 unspecified number of arguments.

      注意

      在 C++ 中,这一切都是不同的场景。 C++ 中的void hello() 声明了一个函数hello(),它返回一个void 并接受no arguments.

      【讨论】:

        【解决方案3】:

        根据我从The C Book 4.2 收集到的信息,您的函数定义不是原型,因为它没有为参数指定类型信息。这意味着编译器只记住返回类型并且不保留任何关于参数的信息。

        这种形式的定义仍然允许向后兼容,并且不限于不带参数的函数。 gcc 将同样允许类似的东西

        void hello( a ) {
        }
        
        int main( int argc, char* argv[] ) {
         int test = 1234;
         hello(test,1);
        
         return 0;
        }
        

        这里重要的只是缺少参数的类型信息。要解决此问题并确保 gcc 在使用函数时检查参数,您可以将类型信息放在函数的声明或定义中。最好将它们放在两者中。

        当然,所有这些仍然不能真正回答您关于为什么 gcc 不警告您的问题。一定是 gcc 团队认为仍然有足够的老式 C 代码来证明默认情况下抑制警告是合理的。 IMO 我很惊讶@caf 提到的-Wstrict-prototype 选项默认没有打开。

        【讨论】:

          【解决方案4】:

          哈,前几天我也吃过这个。

          您的定义必须是:

          void hello(void);
          

          否则该函数可以接受任意数量的参数。

          但我确实理解你的意思。几乎没有编译器会给出最轻微的警告。

          【讨论】:

          • @leppie:我不关注。为什么编译器要对函数的有效调用发出警告?
          • 如果将-Wstrict-prototypes 标志添加到gcc,它会发出警告:x.c:4: warning: function declaration isn't a prototype
          • @leppie:啊,好吧,读完The C Book 4.2我现在明白了。我对你关于它接受任何数量的参数的说法感到困惑,这让我认为调用是有效的,即我认为它就像使用省略号。
          • @Troubadour:如果没有void,那么就像...(没有第一个参数)。
          • @leppie:除非你无法获取参数,因为... 需要至少一个前面的参数才能传递给va_start。你的意思是编译器会让你调用它,不管你传递给它什么?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-19
          • 2013-11-02
          • 1970-01-01
          相关资源
          最近更新 更多