我应该停止使用术语C / C ++吗?

时间:2015-09-30 19:27:57

标签: c++ c c++11

我理解C和C ++是不同的语言但是当我学习C ++时,我总是被告知 C是C ++的一个子集或者C ++是带有类的C。直到C ++ x0,C ++ 11(或者现代C ++ 11/14/17)的出现,这才是真实的。事实上(特别是在处理嵌入式系统时),它很可能会找到用C ++编写的代码,但很多部分完全用纯C语言编写。在这里,我有几个问题:

  1. 我应该停止使用术语C / C ++吗?
  2. 如果对#1的回答是肯定的,我如何调用使用C和C ++混合的程序?
  3. 鉴于他们两个都是不同的'语言很可能在某些时候C ++编译器停止支持用C语言编写的代码(因为现代c ++在指针,动态内存处理等基本内容方面偏离了C语言)
  4. 现在是否有制定C / C ++标准以保持兼容性的人之间的合作
  5. 如果#4是肯定的,那么这种合作可能会在不久的将来以 modern c ++ (11/14/17)的外观结束
  6. 我知道已经有类似的问题了,但我确信很多人都有这些疑惑,所以我非常有兴趣专门针对与C ++趋势有关的问题得到好的答案在不久的将来。

3 个答案:

答案 0 :(得分:4)

  

我总是被告知C是C ++的一个子集,或者C ++是带有类的C。在C ++ x0,C ++ 11(或者现代C ++ 11/14/17)出现之前,这一点很安静。

C从未成为C ++的子集。例如,C89不是C ++ 98的子集。

一些例子:

  • C ++不支持函数参数声明的C89 标识符列表格式
  • C89和C ++ 98具有不同的字符常量类型
  • C89和C ++ 98具有不同的字符串文字类型
  • 逻辑运算符在C89和C ++ 98中产生不同的类型(int vs bool
  
      
  1. 我应该停止使用术语C / C ++吗?
  2.   

  
      
  1. 如果对#1的回答是肯定的,我如何调用使用C和C ++混合的程序?
  2.   

程序是C或C ++(即使某些非常基本的程序可以使用C或C ++编译器编译)。你用什么编译器来编译它?它应该回答你的问题。哈比森&斯蒂尔创造了术语Clean C来指定C和C ++的共同子集,但我认为这是一个坏主意。

编辑:但我承认,从技术上讲,您可以在单个程序中链接C和C ++对象文件,但是有许多语言允许在单个程序中混合,例如Java和C ++ 。我认为使用术语C / C ++程序只会增加混淆,因为它是用一种叫做C / C ++的语言编写的。

  
      
  1. 鉴于它们都是“不同”的语言,很可能在某些时候C ++编译器停止支持用C语言编写的代码(因为现代c ++偏离了C语言的基本内容,如指针,动态内存处理,等)
  2.   

任何C ++版本都不支持C99或C11的许多功能(例如:可变长度数组,灵活数组成员,_Generic,...)。

答案 1 :(得分:4)

C从来都不是C ++的子集。最明显的例子是int new;。自从C89和C ++ 98以来,这种情况一直如此,随着新标准的出现,语言之间的关系也越来越远。

  

我应该停止使用术语C / C ++

  

如果对#1的回答是肯定的,我如何调用使用C和C ++混合的程序?

源文件用一种语言或另一种语言编写。程序可以包含多种语言协同工作的代码,也可以包含链接不同编译对象的可执行代码。你会说这个程序是用C和C ++编写的," C / C ++"不是一种语言。

  

鉴于他们两个都是不同的'语言很可能在某些时候C ++编译器停止支持用C语言编写的代码

3)他们从未这样做过。 int *a = malloc(10);CC++早已分道扬..单击链接或查看下面的C89及以上版本的文件,但在任何C ++标准下都无效。

4)afaik不,工作组相互了解,但标准做出了最适合自己的决定。

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

我总觉得值得一提的是C 是Objective-C的一个子集。

答案 2 :(得分:2)

  

一般来说,SO用户会询问提出问题的人选择语言:C或C ++。为什么呢?

C和C ++之间存在许多细微差别。例如,在C ++中,全局范围内的const变量具有内部链接,除非声明为extern,但在C中它具有外部链接,除非声明为static。通过说“C / C ++”,OP正在断言他们的问题的答案在C和C ++中是相同的,当它很可能不是时。 这对于那些想成为回答者的事情来说更加不必要。

  • 有时我们可以发现代码在一种语言或另一种语言中无效(例如,从void*到指向对象的指针的隐式转换在C ++中无效)。这很烦人。当你有一段在C而不是C ++中有效的代码时,为什么要说“C / C ++”?您是否打算使用C,或者这仅仅是C ++代码中的错误?

  • 有时答案会因语言而异(例如,C99中存在可变长度数组但C ++中不存在)。如果我们不知道你在说什么语言,要么我们必须猜测,要么在只有一个实际有用的时候为两者写一个答案,因为你知道你实际使用的是哪种语言;你只是没有告诉我们!

  • 有时两种语言的答案确实相同,但很难确定。例如,我认为C和C ++具有相同的整数转换规则,但为了真正,非常确定,我必须仔细阅读这两个标准。同样,当你可能只关心其中一种语言时,这使我做了两倍的工作。

无论如何,要回答你的其他问题:

  1. 如果要将C和C ++代码链接在一起,则可以同时使用这两个标记,但请指定每个文件所在的语言。

  2. 有时会发生重大变化,但它们很少见且影响有限(否则它们不会获得批准)。例如,C ++ 11中的auto

  3. 我不认为他们直接合作,但他们会关注其他语言的发展,并尽量避免引入会使兼容性更加困难的更改。

  4. 如果你真的想知道这两种语言,那很好,你可以在你的问题中说出来。当你说“C / C ++”时,我真的不确定你的意思,看起来你真的在假设这两种语言。

相关问题