如何判断一个项目是C语言还是C++语言?

3
wprintf(L"Selecting Audio Input Device: %s\n", 
                            varName.bstrVal);
if(0 == wcscmp(varName.bstrVal, L"IP Camera [JPEG/MJPEG]"))
{
    ...
}

hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
                        IID_IBaseFilter, (void **)&pGrabberF);

上述内容来自一个.cpp文件,但你可以看到它的内容非常C风格。你会认为这是一个C还是C++项目?

任何人都可以从C++文件中提取类似于C的代码片段。仅凭这几行无法确定。是否有声明或使用任何类?是否使用了模板?是否使用了任何特定于C++的库?回答这些问题将更有帮助。 - FrustratedWithFormsDesigner
不使用类和模板。对于第三个问题,请定义C++特定的库... - COMer
我在这里看不到一个连贯的问题。我称它为什么有什么关系呢? - David Thornley
wprintf()函数表明它是C++的。 - user379888
@ Fahad,除非你有理由,否则大多数人不会同意。 - COMer
3个回答

4

这取决于您如何编译它。

有些代码可以同时编译为C和C++,如果使用C++编译器编译,则被视为C++代码。

C并非C++的精确子集,顺便说一下。

通常,您可以通过文件扩展名快速判断,但是也可以将C代码放在.cc或.cpp扩展名中,也可以将C++代码放在.c扩展名中,但这很少见。


在我看来,Visual Studio使用相同的编译器来处理C和C++,不是吗? - COMer
@COMer: 大多数情况下,如果你使用 .c,它将编译为C,并且允许从 void* 进行隐式转换等操作。 - Billy ONeal
我在我的帖子中添加了一行额外的内容,现在怎么样? - COMer
@COMer:是的,你仍然可以称它为C++项目。Win32 API是为C语言构建的,你也可以使用C++。 - Brian R. Bondy
你的意思是所有的Win32 API都可以在C和C++中使用吗? - COMer
VC++几乎不是一个C编译器。它很糟糕。然而,我确信C++03“合并”了C89,这也是VC++所支持的。你第一次接触C语言是通过Windows和MSVC,真是太遗憾了。 - Matt Joiner

1
我会称它为一个 C 项目,因为在 C++ 中使用原始指针进行 C 风格的字符串比较是不可取的。异常或其他东西会摧毁那段代码。正确的解决方案是将 bstrVal 更改为 BSTR 类,该类具有 wchar_t* 的 operator== 重载。

BSTR不是一个类,它是一种类型(OLECHAR*)。你是不是指_bstr_t或CComBSTR? - Steve Townsend
这就是为什么我建议将其更改为RAII自释放运算符重载类的原因。 - Puppy

0

我认为这取决于链接方式。如果它是一个旨在与C链接的库,那么它就是C。如果它需要与C++链接,那么它就是C ++。如果它提供了两个选项,那么它就是两者都可以。

然而,如果它不是一个库,并且需要使用C++编译器构建,那么它就是一个C++项目。

更新0

这仍然是一个链接方式的问题。您提供的代码将在C和C++下都编译。


我在我的帖子中添加了一行额外的内容,现在怎么样? - COMer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接