Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何处理term.h中的入侵标识符?_C_Identifier - Fatal编程技术网

C 如何处理term.h中的入侵标识符?

C 如何处理term.h中的入侵标识符?,c,identifier,C,Identifier,在测试一些代码(包括term.h)时,我发现了一些奇怪的错误,这些错误使用了常见的标识符,例如tab或columns。这是因为这个头定义了很多宏。以下是一些例子: /* from term.h */ #define columns CUR Numbers[0] #define lines CUR Numbers[2] #define bell CU

在测试一些代码(包括
term.h
)时,我发现了一些奇怪的错误,这些错误使用了常见的标识符,例如
tab
columns
。这是因为这个头定义了很多宏。以下是一些例子:

/* from term.h */

#define columns                        CUR Numbers[0]
#define lines                          CUR Numbers[2]
#define bell                           CUR Strings[1]
#define insert_line                    CUR Strings[53]
#define tab                            CUR Strings[134]
但是,我没有找到任何关于这些宏常量的文档。它似乎是访问
终端
数据结构的某些成员的快捷方式。当然,解决方案是
#undef
源代码中使用的每个标识符。但它是非常严格的

所以我的问题是:为什么不在
term.h的标识符前面加前缀?

它们通常在实际源代码中用作局部变量,因此会导致无法理解的错误

有两种方法来处理标识符冲突:

  • 更改
    term.h中的标识符
  • 更改代码中的标识符
  • 第一个是否定的,我希望不需要解释原因<代码>术语.h
    早在你的代码在大脑中形成思想之前就存在了。因此,创建冲突标识符完全是您的错^W问题^W的责任。:-)

    也许还有另一个选择:

    • 首先不要使用/包括
      术语.h

    假设必须使用term.h,一个选项是将该文件包含的内容与特定模块隔离,以便您的整个代码不会冲突。但正如Jens所说,你的任务是“不要有名字冲突”。属于系统的公共头文件不应该仅仅因为使用了与这些文件相同的名称而被更改

    我很想包含
    awk'$1==“#定义“{print”#未定义“$2}”/usr/include/term.h
    的结果。此文件已成为历史,更改它将破坏许多编译并使许多人感到困惑:-)@pbhd:I得到了,
    #undef tcsetattr(fd,
    ,这是一个语法错误。您需要使用regexp来匹配标识符。+1表示“不包含
    term.h
    ”。这对OP来说几乎没有什么有用的建议,但请在“不要使用过时的代码”类别。提及其他选项可能会使我的投票合法化
    ;-)
    嘿,我知道这是我的错。但是,这个标识符在源代码中经常使用,所以有点限制……但我同意你的答案。