如何在C项目中使用C源文件?

前端之家收集整理的这篇文章主要介绍了如何在C项目中使用C源文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C项目中,包含C源文件的.h文件将导致许多错误,因为C和C之间的标准不同.
如何在C项目(或main.cpp)中使用C源文件

解决方法

为了最大的可靠性:

>使用C编译器编译C源代码.
>使用C编译器编译C源代码
>最好在C中写main()函数.
>将程序与C编译器链接.

确保C头或者自己知道C,或者C代码包含一个extern“C”{…}块中的C头.

(C头文件cheader.h):

#ifndef CHEADER_H_INCLUDED
#define CHEADER_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif

...main contents of header...

#ifdef __cplusplus
}
#endif

#endif /* CHEADER_H_INCLUDED */

或(C源代码):

extern "C" {
#include "cheader.h"
}

现代C风格非常接近C和C语言的共同子集.然而,任意C代码不是很多原因的C代码,简单地调用C源文件C源文件(通过更改扩展名,或者简单地通过使用C编译器进行编译)不能保证成功.一般来说,将C编译为C并将C编译为C,然后将生成的目标文件与C编译器进行链接(以确保正确的支持库被调用).

但是,如果MSVC编译器说使用MFC的程序必须单独使用C编写(MFC要求C编译(使用.cpp后缀)是报告的错误),则您可能别无选择,只能确保您的C代码可编译为C代码.这意味着你必须从malloc()等人转换返回值;你必须担心别的地方你不使用转换将一个void *转换成其他指针类型;你必须担心C中的sizeof(‘a’)== 4和C中的sizeof(‘a’)== 1;您必须确保在使用之前声明每个函数;您必须确保您的C代码不使用任何C关键字(特别是类型名称,有时也是内联),但完整列表相当大).

在某些方面,您不得不担心C99中不在C 2003或C 2011中的功能的使用,例如灵活的数组成员,指定的初始化程序,复合文字,可变长度的数组等等.但是,如果C代码用于MSVC,那么这可能不是一个问题; MSVC C编译器不支持这些功能(它仅支持C89,而不支持C99).

FWIW:我有一个脚本来追踪C关键字.它包含以下注释:

# http://en.cppreference.com/w/cpp/keywords
# plus JL annotations
# and                               C (<iso646.h>)
# and_eq                            C (<iso646.h>)
# alignas (C++11 feature)
# alignof (C++11 feature)
# asm                               C (core)
# auto(1)                           C (core)
# bitand                            C (<iso646.h>)
# bitor                             C (<iso646.h>)
# bool                              C99 (<stdbool.h>)
# break                             C (core)
# case                              C (core)
# catch
# char                              C (core)
# char16_t (C++11 feature)
# char32_t (C++11 feature)
# class
# compl                             C (<iso646.h>)
# const                             C (core)
# constexpr (C++11 feature)
# const_cast
# continue                          C (core)
# decltype (C++11 feature)
# default(1)                        C (core)
# delete(1)
# double                            C (core)
# dynamic_cast
# else                              C (core)
# enum                              C (core)
# explicit
# export
# extern                            C (core)
# false                             C99 (<stdbool.h>)
# float                             C (core)
# for                               C (core)
# friend
# goto                              C (core)
# if                                C (core)
# inline                            C (core)
# int                               C (core)
# long                              C (core)
# mutable
# namespace
# new
# noexcept (C++11 feature)
# not                               C (<iso646.h>)
# not_eq                            C (<iso646.h>)
# nullptr (C++11 feature)
# operator
# or                                C (<iso646.h>)
# or_eq                             C (<iso646.h>)
# private
# protected
# public
# register                          C (core)
# reinterpret_cast
# return                            C (core)
# short                             C (core)
# signed                            C (core)
# sizeof                            C (core)
# static                            C (core)
# static_assert (C++11 feature)
# static_cast
# struct                            C (core)
# switch                            C (core)
# template
# this
# thread_local (C++11 feature)
# throw
# true                              C99 (<stdbool.h>)
# try
# typedef                           C (core)
# typeid
# typename
# union                             C (core)
# unsigned                          C (core)
# using(1)
# virtual
# void                              C (core)
# volatile                          C (core)
# wchar_t                           C (core)
# while                             C (core)
# xor                               C (<iso646.h>)
# xor_eq                            C (<iso646.h>)

(1)后缀是CPP参考的脚注:

>(1) – 意思在C 11中改变

原文链接:https://www.f2er.com/c/115917.html

猜你在找的C&C++相关文章