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++.
奇怪的是,许多编译器并没有强行禁止通过预处理器重新定义关键字:
#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,并且映射的右侧是关键字没有问题。
无论如何......如果你能改变它,更好的答案是......改变它!
| 归档时间: |
|
| 查看次数: |
1343 次 |
| 最近记录: |