使用C库头的C++程序将"this"识别为关键字.外部"C"错误?

nya*_*108 12 c c++ this header-files extern

我的C++程序需要使用外部C库.因此,我正在使用

extern "C"
{
   #include <library_header.h>
}
Run Code Online (Sandbox Code Playgroud)

我需要使用的每个模块的语法.

它一直运作到现在.模块在其头文件中使用名称作为某些变量.C库本身编译得很好,因为据我所知,从来就不是C中的关键字.

但是,尽管我使用了extern"C"语法,但当我包含该头文件时,我的C++程序出错了.

如果我每次重命名与类似的东西C库头文件_this,一切似乎都正常工作.

问题是:

不应在外部的"C"的语法够向后兼容性,至少在语法级别,对于一个头文件?这是编译器的问题吗?

utn*_*tim 14

外部"C"语法不应该足以向后兼容,至少在语法级别,对于头文件?这是编译器的问题吗?

不.Extern"C"用于链接 - 特别是用于生成的符号名称的策略("名称修改")和调用约定(将生成用于调用API和堆栈参数值的程序集) - 不编译.

您遇到的问题不仅限于this关键字.在我们当前的代码库中,我们将一些代码移植到C++中,我们有这样的结构:

struct Something {
    char *value;
    char class[20]; // <-- bad bad code!
};
Run Code Online (Sandbox Code Playgroud)

这在C代码中工作正常,但(像你一样)我们被迫重命名为能够编译为C++.

  • @ColeJohnson:这通常是对标题的好建议,对实现的错误建议.如果有人试图用C++编译器编译它,你*希望*C代码快速破解并破坏.引入细微的错误,因为它们是不同的语言,具有不同的语义,这更糟糕. (6认同)
  • 专业提示:编写C库时编写C++名称兼容代码.为其他开发人员节省了很多麻烦. (5认同)

Hos*_*ork 5

奇怪的是,许多编译器并没有强行禁止通过预处理器重新定义关键字:

#include <iostream>

// temporary redefinition to compile code abusing the "this" keyword
#define cppThis this
#define this thisFunction

int this() {
    return 1020;
}

int that() {
   return this();
}

// put the C++ definition back so you can use it
#undef this
#define this cppThis

struct DumpThat {
    int dump() {
       std::cout << that();
    }
    DumpThat() {
       this->dump();
    }
};

int main ()
{
    DumpThat dt;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您遇到困难,那可以让您编译一个写入 C 假设的文件,您无法更改。

但是,它不会允许您获得“this”的链接器名称。可能有链接器可以让您对名称进行某种重新映射以帮助避免冲突。这样做的副作用可能是它们允许您说thisFunction -> this,并且映射的右侧是关键字没有问题。

无论如何......如果你能改变它,更好的答案是......改变它!

  • @MSalters 参见 [Keywords redefinition in C / C++](http://stackoverflow.com/q/12286691/211160)...当然可以将预处理器使用中的单词列入黑名单。 (2认同)