【问题标题】:What does "CONST func(arg);" mean in C language?"CONST func(arg);" 是什么意思在C语言中是什么意思?
【发布时间】:2011-08-27 01:11:49
【问题描述】:

This 是一个 c 程序,演示了 libxml2 库的一些基本用法。下面是从main函数中引用的:

LIBXML_TEST_VERSION example1Func(argv[1]);

这句话代表什么?

我只能说 LIBXML_TEST_VERSION 显然是一个常量,然后是一个函数调用,该函数什么也不返回(void)。但我不知道这句话的整体含义。

【问题讨论】:

  • 我现在感到非常抱歉,因为我链接到的原始程序中的行实际上是两行。我想这是我的 IDE 的自动缩进系统做出了错误的决定。所以这个问题其实是没有意义的。
  • 不过,你们的速度令人印象深刻!
  • 没问题 - 今天我们都了解到:所有大写符号不一定都是常量,你不应该相信代码的格式,以及 LIBXML_TEST_VERSION 宏的作用。 ;-)

标签: c semantics


【解决方案1】:

LIBXML_TEST_VERSION 不是常量 - 它是一个宏 - 请参阅此处的文档:

Macro: LIBXML_TEST_VERSION

#define LIBXML_TEST_VERSION
Macro to check that the libxml version in use is compatible with the version the software has been compiled against

这也与调用example1func() 无关 - 代码应如下所示(cmets 是我的):

LIBXML_TEST_VERSION    // test libxml version

example1func();        // call example1func

【讨论】:

  • +1:这种宏很烦人,但正是因为这种混乱。如果宏没有定义结尾的;,我会更喜欢它,这至少会强制您使用; 明确地为实例添加后缀,从而减少视觉混乱。
  • @Oli:确实 - 通常多行宏应该包含在 do { ... } while (0) 中以允许使用终止分号
【解决方案2】:

看起来LIBXML_TEST_VERSION 是一个扩展为一个或多个语句的宏。从Google code search 看来,定义类似于:

#define LIBXML_TEST_VERSION xmlCheckVersion(20703);

20703 是您正在编译的任何版本。

此语句独立于对example1Func() 的调用。

【讨论】:

    【解决方案3】:

    在 ALL_UPPERCASE 中命名 C 预处理器宏是标准约定。正如您所建议的,这通常用于编译时常量。但是,还有其他用途。

    现在来看你的例子。原始出处是这样的(cmets 是我的):

    LIBXML_TEST_VERSION    /* line 1 */
    example1Func(argv[1]); /* line 2 */
    

    第一行是一个 C 宏。第二行是函数调用。正如您的问题所暗示的那样,这两者不是同一陈述的一部分。不幸的是,LIBXML_TEST_VERSION 的定义方式在末尾不需要分号;如果是这种情况,就不会混淆这两行是否属于同一语句。

    如果您想知道LIBXML_TEST_VERSION 到底是什么:

    Macro: LIBXML_TEST_VERSION
    
    #define LIBXML_TEST_VERSION
    Macro to check that the libxml version in use is compatible
    with the version the software has been compiled against
    

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2020-08-07
      • 2016-12-03
      • 2011-09-02
      相关资源
      最近更新 更多