我有一个int ID
,我想在C++中定义并使其可用于C语言链接(为简单起见而构造的情况):
/* i.h */
#ifdef __cplusplus
extern "C" {
#endif
extern int ID;
#ifdef __cplusplus
}
#endif
以下是使用 int
的 C 和 C++ 程序:
/* m.cpp */
#include "i.h"
#include <iostream>
int main() { std::cout << ID << std::endl; }
/* m.c */
#include "i.h"
#include <stdio.h>
int main() { printf("%d\n", ID); }
现在我想知道extern "C"
和/或extern
的语法。这里展示了如何定义和不能定义int ID
:
/* i.cpp */
// const int ID = 88; // no C linkage, obviously, LNK2019/1120
// extern "C" const int ID = 88; // provides C linkage
// extern "C" { const int ID = 88; } // no C linkage, surprisingly, LNK2019/1120
// extern "C" { extern const int ID = 88; } // C linkage restored
编译:
cl /nologo /W4 m.cpp i.cpp /MD /EHsc
cl /nologo /W4 m.c i.cpp /MD
我不明白使用带有
{block}
的 extern "C"
时的语法。我需要重复使用 extern
,而对于没有块的形式 extern "C"
,则不需要这样做。这只是一种语法怪异还是还有更多的东西呢?我在 Dale Rogerson 的书《Inside COM》第98页上遇到了这个问题。有一个代码清单,其中包含嵌套的
extern
和一个旨在澄清的注释(但我不理解)。#include <objbase.h>
extern "C"{
extern const IID IID_IX = {0x32bb8320, 0x41b, 0x11cf, ...};
// The extern is required to allocate memory for C++ constants.
}
有人能解释一下内部的
extern
吗?