精华内容
下载资源
问答
  • Q:萌新求助,为啥不开 -O2 能 AC,开了 -O2 就 RE/...未定义行为(Undefined Behavior,UB),是一类对程序无任何限制的行为。在 C/C++ 中,未定义行为的例子非常地多,我们在下文将会提到一些例子。1 和其他概念的...

    94a2b71708aedd950880bae0c6c2913b.png
    Q:萌新求助,为啥不开 -O2 能 AC,开了 -O2 就 RE/TLE/WA 了?
    A:你的程序可能有 UB。
    Q:萌新求助,为啥本地数据能过,提交就全 RE/TLE/WA 了?
    A:你的程序可能有 UB。
    Q:所以啥是 UB?

    未定义行为(Undefined Behavior,UB),是一类对程序无任何限制的行为。

    在 C/C++ 中,未定义行为的例子非常地多,我们在下文将会提到一些例子。

    1 和其他概念的辨析

    在 C/C++ 中,和未定义行为容易混淆的概念有两个,实现定义行为未指明行为。这里先对这几个概念做一个辨析。

    • 实现定义行为:程序的行为随实现而变动,遵从标准的实现必须为每个这样的行为的效果提供文档。一个例子是 int 在不同环境下的大小(标准规定为至少 16 位,现在大多数环境下均为 32 位)。
    • 未指明行为:程序的行为随实现而变动,而不要求遵从标准的实现为每个行为的效果提供文档。虽然行为在变动,但它产生的结果均应该是合法的。一个例子是变量分配的方式和位置(可以把一次定义的不同变量分配到一片连续的空间,当然也可以分开分配)。
    • 未定义行为:对程序的行为无任何限制。前两类行为的结果都要求是合法的,而对于未定义行为,则不要求程序做任何合法,有意义的事情。一个例子是访问非法内存。

    2 为什么会有未定义行为?

    一个正常的 C/C++ 程序的行为都应该是合法的,像未定义行为这样的操作不应该在程序中出现。

    有人也许会奇怪:那为什么不去检测未定义行为,将未定义行为视为语法或语义错误而终止编译呢?

    事实上对未定义行为的检测并没有检测语法和语义错误那么容易。有些未定义行为的检测比较容易(比如访问未初始化的变量),但诸如带符号整数溢出这样的行为,因为它并不一定会发生,在编译阶段检测它就困难不少。

    而假如编译器要考虑这些未定义行为的话,则不利于程序优化。

    因此将一些操作指定为未定义行为,编译器就不必再考虑这些操作,从而利于程序优化。

    这也是一些程序在没有优化的情况下行为正常,开启优化选项之后出现不期待的结果的原因。

    3 一些未定义行为的例子

    3.1 带符号整数算术溢出

    #include <iostream>
    using namespace std;
    int main()
    {
     int x;
     cin>>x;
     if(x+1<x)
      cout<<"Overflow!"<<endl;
     else
      cout<<"Not overflow!"<<endl;
     return 0;
    }

    试着输入 2,147,483,6472147483647 ( 2^{31}-1231−1 )看看程序结果吧!

    如果你编译的时候开启了 -O2 优化选项,或者你的编译器版本比较高的话,你可能会发现预期的输出 Overflow! 没有出现。

    为什么呢?因为带符号整数溢出是未定义行为,从而编译器不会考虑这种情况。在忽略这种情况的前提下,x+1<x 一定为假,从而上面这段程序事实上与下面这段程序等价:

    #include <iostream>
    using namespace std;
    int main()
    {
     int x;
     cin>>x;
     cout<<"Not overflow!"<<endl;
     return 0;
    }

    你也许会奇怪,为什么不将带符号整数溢出的行为给一个明确的定义呢?

    事实上,给带符号整数溢出下定义会带来很多不必要的开销。

    我们来看下面这个程序:

    #include <iostream>
    using namespace std;
    int main()
    {
     int x;
     cin>>x;
     cout<<x*2/2<<endl;
     return 0;
    }

    如果带符号整数溢出是有定义的,那我们就要老实执行一次乘法和一次除法运算。

    而把它定为未定义行为,编译器就可以直接优化成这样:

    #include <iostream>
    using namespace std;
    int main()
    {
     int x;
     cin>>x;
     cout<<x<<endl;
     return 0;
    }

    瞬间减少了不少开销,对吧?当操作次数很多的时候效果当然更加明显。

    需要注意的是,无符号整数溢出不是未定义行为。也就是说:

    920585a7969b202b03ba41f7808c7ab5.png
    #include <iostream>
    using namespace std;
    int main()
    {
     unsigned x;
     cin>>x;
     if(x+1<x)
      cout<<"Overflow!"<<endl;
     else
      cout<<"Not overflow!"<<endl;
     return 0;
    }

    如果你输入 4,294,967,2954294967295 ( 2^{32}-1232−1 ),会发现它的行为是符合预期的(输出 Overflow!)。

    3.2 越界访问

    越界访问是一件让人很头大的事情。

    众所周知,C/C++ 并不会进行越界检查,因此越界访问造成的后果可能有这几种:

    • 访问非法内存而导致程序运行时错误(RE);
    • 意外访问程序里的其他变量导致 暴力写挂;

    为啥不进行越界检查呢?在多数情况下,越界检查的成本并不小,而且进行了越界检查会丧失不少程序优化的机会。因此最划算的决定就是不进行越界检查。

    3.3 无可视副作用的无限循环

    在开始讲这个之前,先引出 C++ 的一个原则,如同原则(as if),这是不少优化的基础。

    简单来说,在不影响程序运行结果的前提下,允许编译器进行一些代码转换。当然,未定义行为造成的影响是例外,因为这种行为不会被编译器考虑。

    因此,可以通过消除冗余代码来达到优化的目的。

    因为无可视副作用的无限循环是未定义行为,编译器有时可以直接将它优化掉。

    #include <iostream>
    using namespace std;
    int f()
    {
     unsigned cnt=0;
     while(1)
      if(cnt<0)return true;
     return false;
    }
    int main()
    {
     if(f())//停机问题(大雾
      cout<<"This program has been terminated."<<endl;
     else
      cout<<"Some strange things happened!"<<endl;
     return 0;
    }

    在 g++ 8.3 下进行编译,程序进入了死循环,而在 clang++ 6.0.0 下进行编译,程序则无输出终止。

    查了下汇编代码,发现 main() 函数在 clang++ 下被优化成了空。

    也就是说,这一无限循环因为是未定义行为,而被编译器视为冗余代码而消除。

    3.4 无法确定的运算顺序

    现在据说还有不少教材还在考这种奇怪的东西。

    #include <iostream>
    using namespace std;
    int main()
    {
     int x=1;
     cout<<(x++ + ++x)<<endl;
     return 0;
    }

    根据 C++11 起的 “按顺序早于”规则,这种式子用一句比较拗口的话来说,就是:标量对象上的一项副作用相对于同一标量对象上的另一副作用为无顺序,则其行为未定义。

    在这个式子中,x++ 的副作用和 ++x 的副作用相比,可以在前面发生,也可以在后面发生,因此它是未定义的。

    3.5 访问未初始化变量

    #include <iostream>
    using namespace std;
    int main()
    {
     int x;
     if(x)
      cout<<"True"<<endl;
     if(!x)
      cout<<"False"<<endl;
     return 0;
    }

    据说在比较旧的 g++ 版本上编译会出现两个都输出的奇怪现象。不过这既然是未定义行为,怎么样的输出都是合理的。

    4 如何检测未定义行为?

    在编译期检测未定义行为难度并不小,原因在上文已经说的很清楚了。

    不过在运行期,还是有一些方法来捕捉程序的未定义行为的。这将在一定程度上方便我们的调试。

    一种非常实用的检测未定义行为的方式是使用 clang 的诊断模式。

    只需在编译选项中加上一条:-fsanitize=undefined 即可开启。

    (注:Linux 下的 g++ 也提供这一编译选项)

    #include <iostream>
    using namespace std;
    int a[10005];
    int main()
    {
     if(a[10005])
      cout<<42<<endl;
     return 0;
    }

    对于上面这个出现数组越界的程序,运行的结果将是:

    a.cpp:6:5: runtime error: index 10005 out of bounds for type 'int [10005]'

    PS:Codeforces 也支持了这个功能,可以在 Custom Test 中选择 Clang++17 Diagnostics 开启。

    5 总结

    作为 C/C++ 的一大特色,未定义行为让不少人都头疼不已。未定义行为不可预测的特点,使调试的难度加大了不少。

    避开未定义行为的关键是养成良好的编程习惯。当然一些辅助的检测手段对于消除未定义行为也能起到非常大的帮助。

    Reference

    • 未定义行为 - cppreference.com
    • 每个 C 程序员都该知道关于未定义行为的事 #1/3
    • 每个 C 程序员都该知道关于未定义行为的事 #2/3
    • 每个 C 程序员都该知道关于未定义行为的事 #3/3

    本文搬运至洛谷日报#265


    搬运不易,举起你可爱的小爪点个赞再走叭?>w<

    展开全文
  • 与MATLAB相比,C/C++的执行效率更高,占用内存更小,如果能够将占用大量时间的核心代码用C/C++实现,编译成动态可执行文件后,在MATLAB中直接调用,就能够提高MATLAB程序的运行速度。不同版本的MATLAB支持的C/C++...

    与MATLAB相比,C/C++的执行效率更高,占用内存更小,如果能够将占用大量时间的核心代码用C/C++实现,编译成动态可执行文件后,在MATLAB中直接调用,就能够提高MATLAB程序的运行速度。

    不同版本的MATLAB支持的C/C++编译器不同,具体可以参考官网链接。下面的代码MATLAB版本为R2018b,使用的C/C++编译器为Visual Studio 2015 Professional。

    MATLAB为C/C++/C++ 11/Fortan/Java/.NET/Python语言留有API接口,

    External Language Interfacesww2.mathworks.cn

    针对C/C++,首先,安装编译器

    mex 

    也可以不在MATLAB中进行编译,而是在VS 2015中编译好后直接拷贝到MATLAB运行文件夹中使用,相对比较复杂,但可以进行调试,具体参考之间的文章

    易夕:MATLAB + VS 2015混合编程并调试zhuanlan.zhihu.com
    8bb327f8b77d78e679568aa792c49460.png

    关于如何编写C/C++的MEX函数,参考官方文档,

    Calling MATLAB from Cww2.mathworks.cn

    下面用一个简单的例子说明C/C++的威力,设有一个有序数组,数组中有一些重复的值,返回去重后的结果。MATLAB 中可以用uniqu函数实现,对于长度为1e9的int32数组,去重需要11.527秒。

    A 

    如果用C实现,采用原地算法,mexFunction代码如下

    include "

    保存为removeDuplicates.cpp,在MATLAB中执行以下命令进行编译

    mex 

    当前文件夹会生成一个removeDuplicates.mexw64文件。现在,可以将removeDuplicates在MATLAB中当作一个函数使用,对长度为1e9的int32数组,去重仅需要2.014秒,相当于原来六分之一的时间。

    A 

    其他更多提高MATLAB运行速度的方法,参考

    易夕:如何提高MATLAB程序运行速度zhuanlan.zhihu.com
    易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com
    展开全文
  •  我认为规则1.3是MISRA规则集中最重要的一条规则,因为消除未定义的行为将直接解决功能安全问题。 查找未定义的行为需要静态分析工具来推理程序的深层语义。轻量级的工具也许能够找到一些实例,但它需要非常复杂的...
    作者8251d221d364c17aa7f55700c03f7bd5.png

    Paul Anderson

    MISRA 委员会成员

    GrammaTech 工程副总裁

          MISRA C是安全使用C编程语言的一套准则,主要使用在安全关键的嵌入式系统中。它的许多规则和指令旨在帮助软件开发人员编写更易于理解和维护的代码。软件开发工作需要团队合作,这些编程风格类的规则是重要的,有益于理解源代码。其他规则禁止进行有风险的设计或已知的不良编程行为。

          编程风格类规则的一个很好的例子是规则5.3“在内部作用域中声明的标识符不应掩盖在外部作用域中声明的标识符”。这显然是一种关于编码风格的警告。违反此规则本身不会导致程序崩溃,但是这样的声明会使代码更难于理解,因为内部标识符混淆了外部标识符。

          违反这种编程风格类准则通常很容易被静态分析工具发现。对于规则5.3,工具可以精确地找到内部声明掩盖了外部声明的位置。MISRA将该规则列为“可判定的(Decidable)”,意味着静态分析工具对此类问题的发现是很少或者没有误报的。

    规则1.3和未定义行为

          MISRA-C:2012规则1.3是完全不同的类别。它指出“不得发生未定义或严重未指定的行为”。通常,人们并不完全理解此规则的重要性以及对违反此规则的检查的复杂性。未定义行为可谓是C编程语言的“阿喀琉斯之踵”,编程时很容易犯下导致未定义行为的错误,后果是灾难性的。如果您很走运,该程序将立即崩溃,在这种情况下,原因比较明显;如果您不走运,未定义行为将潜在地破坏程序状态,程序执行错误的操作,最终呈现难以理解的特征而彻底失败。未定义行为是由某些错误引起的,例如缓冲区溢出、读取未初始化的内存、间接引用无效的地址、甚至是像数据竞争之类的并发问题。许多最严重的安全漏洞的根本原因就在于未定义行为。       C90/C99的标准列出了未定义行为的230个实例,尽管一些行为被MISRA C:2012明确禁止,但仍有将近四分之一未被规则1.3之外的其他规则覆盖。因此,这条规则涵盖了很多方面。       我认为规则1.3是MISRA规则集中最重要的一条规则,因为消除未定义的行为将直接解决功能安全问题。      查找未定义的行为需要静态分析工具来推理程序的深层语义。轻量级的工具也许能够找到一些实例,但它需要非常复杂的机制来发现真正严重的缺陷。这涉及到跨源文件的各个部件的复杂的控制流和数据流。能够实现这一点的静态分析工具使用全程序数据流和控制流分析技术,典型的是使用抽象解释的形式。      在开发周期中尽可能多地检测和解决这些问题是至关重要的。最近,我与一位客户进行了交谈,该客户花了4个星期的工程时间来尝试查找未初始化的变量问题。我们的静态分析工具CodeSonar有能力立即发现问题,是因为CodeSonar 的使命就是查找最严重的软件缺陷和最危险的安全漏洞。
    真正的功能安全比合规性更重要
           现在有些组织要求代码符合MISRA C。这是一件好事,因为许多MISRA C规则都规定了什么样的代码才更易于理解和维护,这也非常重要。但是,让合规性成为静态分析工作的唯一驱动力却存在着很大的危险,因为过分关注代码的表面属性会导致您看不到功能安全问题,这才是最重要的事实。一个简单化的静态分析工具可能不会报告程序的违规情况,而由于未定义的行为,该程序可能会充满严重缺陷。因此,擅长发现违反规则1.3的静态分析工具要比只发现违反浅层属性的工具更有价值。       CodeSonar能够发现的严重的软件缺陷是同类静态分析工具的五倍。是的,这可能意味着您的团队必须分类鉴别更多的静态分析警告,但是这样做也具有很大价值,因为这同样意味着您可以在错误更容易被修复的早期发现它们。获取“新版CodeSonar”的免费体验技术咨询商务服务登陆http://www.softtest.cn/ 联系我们或在微信账号后台留下您的联系信息,其他联系方式如下:

    17611c2bd1360a61cf522fa939e55ff1.png

    下方查看历史文章

    1、CodeSonar通过创新型静态分析增强软件可靠性

    2、CodeSonar技术负责人正式加入MISRA委员会参与新版标准开发

    3、CodeSonar如何帮助无人机查找软件缺陷?

    End

      “以人为本,创新先行

       获取更多资讯

    关注我们7417d3e722eedff1c90d9fc1a5989b63.png1a40270515a887878226ffe268f7a67f.png

                                    在看,支持旋极科技

    展开全文
  • 第一种:构造器参数循环依赖Spring容器会将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中。因此如果在创建Bean过程中发现自己已经在“当...

    c32f3f1628e4617d8a098fdf50abf432.png

    循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。

    下面说一下Spring是如果解决循环依赖的。

    第一种:构造器参数循环依赖

    Spring容器会将每一个正在创建的Bean 标识符放在一个“当前创建Bean池”中,Bean标识符在创建过程中将一直保持在这个池中。因此如果在创建Bean过程中发现自己已经在“当前创建Bean池”里时将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的Bean将从“当前创建Bean池”中清除掉。首先我们先初始化三个Bean。
    public class StudentA {    private StudentB studentB ;    public void setStudentB(StudentB studentB) {        this.studentB = studentB;    }    public StudentA() {    }    public StudentA(StudentB studentB) {        this.studentB = studentB;    }}
    public class StudentB {    private StudentC studentC ;    public void setStudentC(StudentC studentC) {        this.studentC = studentC;    }    public StudentB() {    }    public StudentB(StudentC studentC) {        this.studentC = studentC;    }}
    public class StudentC {    private StudentA studentA ;    public void setStudentA(StudentA studentA) {        this.studentA = studentA;    }    public StudentC() {    }    public StudentC(StudentA studentA) {        this.studentA = studentA;    }}
    OK,上面是很基本的3个类,StudentA有参构造是StudentB。StudentB的有参构造是StudentC,StudentC的有参构造是StudentA ,这样就产生了一个循环依赖的情况。我们都把这三个Bean交给 Spring 管理,并用有参构造实例化。
    "a" class="com.zfx.student.StudentA">
      <constructor-arg index="0" ref="b">constructor-arg>
    bean>
    "b" class="com.zfx.student.StudentB">
      <constructor-arg index="0" ref="c">constructor-arg>
    bean>
    "c" class="com.zfx.student.StudentC">
      <constructor-arg index="0" ref="a">constructor-arg>
    bean>
    下面是测试类:
    public class Test {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");        //System.out.println(context.getBean("a", StudentA.class));    }}
    执行结果报错信息为:
    Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:  Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference?
    如果大家理解开头那句话的话,这个报错应该不惊讶,Spring容器先创建单例StudentA,StudentA依赖StudentB,然后将A放在“当前创建Bean池”中。此时创建StudentB,StudentB依赖StudentC ,然后将B放在“当前创建Bean池”中,此时创建StudentC,StudentC又依赖StudentA。但是,此时Student已经在池中,所以会报错,因为在池中的Bean都是未初始化完的,所以会依赖错误 ,初始化完的Bean会从池中移除。

    第二种:setter方式单例,默认方式

    如果要说setter方式注入的话,我们最好先看一张Spring中Bean实例化的图

    d0afc5202d96def75c120e1fbc77d0b7.png

    如图中前两步骤得知:Spring是先将Bean对象实例化之后再设置对象属性的。修改配置文件为set方式注入
    <bean id="a" class="com.zfx.student.StudentA" scope="singleton">  <property name="studentB" ref="b">property>bean><bean id="b" class="com.zfx.student.StudentB" scope="singleton">  <property name="studentC" ref="c">property>bean><bean id="c" class="com.zfx.student.StudentC" scope="singleton">  <property name="studentA" ref="a">property>bean>
    下面是测试类:
    public class Test {    public static void main(String[] args{        ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");        System.out.println(context.getBean("a", StudentA.class));    }}
    打印结果为:
    com.zfx.student.StudentA@1fbfd6
    为什么用set方式就不报错了呢 ?
    我们结合上面那张图看,Spring先是用构造实例化Bean对象 ,此时 Spring 会将这个实例化结束的对象放到一个Map中,并且 Spring 提供了获取这个未设置属性的实例化对象引用的方法。 结合我们的实例来看,当Spring实例化了StudentA、StudentB、StudentC后,紧接着会去设置对象的属性,此时StudentA依赖StudentB,就会去Map中取出存在里面的单例StudentB对象,以此类推,不会出来循环的问题喽、下面是Spring源码中的实现方法。以下的源码在Spring的Bean包中的DefaultSingletonBeanRegistry.java类中
    /** Cache of singleton objects: bean name --> bean instance(缓存单例实例化对象的Map集合) */private final Map<StringObject> singletonObjects = new ConcurrentHashMap<StringObject>(64);/** Cache of singleton factories: bean name --> ObjectFactory(单例的工厂Bean缓存集合) */private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>(16);/** Cache of early singleton objects: bean name --> bean instance(早期的单身对象缓存集合) */private final Map<StringObject> earlySingletonObjects = new HashMap<StringObject>(16);/** Set of registered singletons, containing the bean names in registration order(单例的实例化对象名称集合) */private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);/**
     * 添加单例实例
     * 解决循环引用的问题
     * Add the given singleton factory for building the specified singleton
     * if necessary.
     *

    To be called for eager registration of singletons, e.g. to be able to
     * resolve circular references.
     * @param beanName the name of the bean
     * @param singletonFactory the factory for the singleton object
     */

    protected void addSingletonFactory(String beanName, ObjectFactory singletonFactory) {  Assert.notNull(singletonFactory, "Singleton factory must not be null");  synchronized (this.singletonObjects) {    if (!this.singletonObjects.containsKey(beanName)) {      this.singletonFactories.put(beanName, singletonFactory);      this.earlySingletonObjects.remove(beanName);      this.registeredSingletons.add(beanName);    }  }}

    第三种:setter方式原型,prototype

    修改配置文件为:
    <bean id="a" class="com.zfx.student.StudentA" scope="prototype"><property name="studentB" ref="b">property>bean><bean id="b" class="com.zfx.student.StudentB" scope="prototype"><property name="studentC" ref="c">property>bean><bean id="c" class="com.zfx.student.StudentC" scope="prototype"><property name="studentA" ref="a">property>bean>

    scope="prototype" 意思是 每次请求都会创建一个实例对象。

    两者的区别是:有状态的bean都使用Prototype作用域,无状态的一般都使用singleton单例作用域。测试用例:
    public class Test {    public static void main(String[] args{        ApplicationContext context = new ClassPathXmlApplicationContext("com/zfx/student/applicationContext.xml");        //此时必须要获取Spring管理的实例,因为现在scope="prototype" 只有请求获取的时候才会实例化对象        System.out.println(context.getBean("a", StudentA.class));    }}
    打印结果:
    Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:    Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference?
    为什么原型模式就报错了呢?
    对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。

    作者:cy_frank

    cnblogs.com/frank223/p/11832079.html

    往期精选

    面试官:为什么选择B+树作为数据库索引结构?

    从 0 开始手写一个 Mybatis 框架,三步搞定!

    Spring Boot集成 Sharding-jdbc + Mybatis-Plus 数据库中间件完美解决分库分表问题

    安全框架 Spring Security 如何实现 rememberMe 自动登录

    IntelliJ IDEA 中集成 SonarLint 代码规范与质量检测插件

    从零开始,开发一款属于自己的 IDEA 插件,要啥功能就做啥!

    MySQL 表之间关联查询时,为什么建议小表驱动大表?

    Redisson 是如何实现分布式锁的?

    ElasticSearch 的基本概念和集群分布式底层实现

    为什么阿里巴巴规定代码中禁用 static 修饰 SimpleDateFormat?

    学会 IDEA REST Client 后,Postman就可以丢掉了...

    632e4ef85ae969a0ddc7333ec1bd6691.png

    点个赞,就知道你“在看”!
    展开全文
  • 宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名。给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很...
  • 那一段长这样 Status CreatBiTree(BiTree& T) { char ch; scanf("%c", &ch); if (ch == ' ') { T = NULL; } else { if (!(T = (BiTree)malloc(sizeof(LEN...或者不用status,应该怎么改一下啊
  • 展开全部 #include #include #include #define uchar unsigned char #define uint unsigned int /*12864端口定义*/ #define LCD_data P0 //... //显示地址 }求解决? 已赞过 已踩过你对这个回答的评价是? 评论 收起
  • voidmian(){inti=0;intover=1;intstudentnumber=0;intdocontrol=0;FILE*fp;if((fp=fopen("student.dat","w"))==NULL){printf("cannotopenfile\n");return;}printf("请输入你们班有多少...void mian(){int i = 0;...
  • vs2017关闭未定义标识符错误提示

    千次阅读 2020-06-02 16:27:31
    功能:仅把vs2017当成单纯的代码编辑器,因为环境复杂,vs2017检测到未定义标识符错误等提示,怎么关闭呢? 解决:工具 > 选项 > 文本编辑器 >C/C++ > 高级 > 把Intellisense中的禁用全部改为true ...
  • 运行的时候说gl3w.h里面有未定义标识符怎么解决?出错的是下面几行: extern PFNGLDRAWARRAYSPROC gl3wDrawArrays; extern PFNGLDRAWELEMENTSPROC gl3wDrawElements; extern PFNGLGETPOINTERVPROC gl3wGetPointerv...
  • 想配合这Spine做骨骼动画 从官网上下的代码 导进来之后 也是一堆未定义标识符 根本没法用 有没有知道怎么解决的大神? ![![![图片说明](https://img-ask.csdn.net/upload/201709/21/1505962079_589435.png)图片说明]...
  • 我以前用的时候并不会出现这样的情况呀,请问有谁遇到过相似的情况吗,可以告诉我怎么解决吗,谢谢![图片说明](https://img-ask.csdn.net/upload/201609/08/1473321813_4593.png)
  • 有人知道怎么解决吗?代码在别人电脑上运行了是没有问题的。 <p style="text-align:center"><img alt="" height="747" src="https://img-ask.csdnimg.cn/upload/1606883035076.png" width="541" /></p>  ...
  • 感谢关注。 我在使用VC2010版本 &#...系统说printf是未定义标识符 ,不知道怎么解决,希望有人能帮我解答一下。 <p>PS:之前有人提到的输入#pragma warning(disable:4996)和s_我试了没有用。</p>
  • 今天写代码,突然想知道程序运行时间,于是我在代码里包含了time头文件,include没有标红,但是在出现CLOCKS_PER_SEC的地方却标了红,显示未定义标识符CLOCKS_PER_SEC 我寻思,这不对劲,time文件里不定义着吗?...
  • 今天写代码,突然想知道程序运行时间,于是我在代码里包含了time头文件,include没有标红,但是在出现CLOCKS_PER_SEC的地方却标了红,显示未定义标识符CLOCKS_PER_SEC 我寻思,这不对劲,time文件里不定义着吗?怎么...
  • 解决在MFC中使用Easylogging++导致TRACE未定义错误 今天用MFC创建一个对话框程序并使用Easylogging++做日志输出,当程序中用TRACE打印信息时候,编译时候会报“error C3861: “TRACE”: 找不到标识符”,TRACE是MFC...
  • sprintf_s 未定义问题

    2019-11-27 17:22:22
    VSCode 出现未识别的标识符 sprintf_s 已经包含了stdio但还是不行 网上说是不是基本库的东西 那么我该怎么解决?
  • guanli.h: #pragma once #pragma once #include typedef stur dar; struct stur { ... cout 请输入1为打印\n请输入2问添加数据\n请输入3删除数据\n请输入4浏览数据\n请输入5排序\n请输入...怎么解决这个问题 应该怎么改
  • guanli.h:的里面是 #pragma once #pragma once #include typedef stur dar; struct stur { ... cout 请输入1为打印\n请输入2问添加数据\n请输入3删除数据\n请输入4浏览数据\n请输入5排序...怎么解决这个问题 应该怎么改
  • covOptional表未定义 这样是自动将新建sheet放在最前面的,可我想把它放在最后面。有办法么?注意是MFC,不是VB。 这个“VARIANT& After”要怎么写,才能生效?是写sheet名,还是写数字?要是能写数字,那就好了。...
  • 这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行...
  • 这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行...
  • 这样看来,所有的问题都解决了,是吗? 31 1.4 新的64位机上的64位类型是什么样的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配...
  • 这样看来,所有的问题都解决了,是吗? 31 1.4 新的64位机上的64位类型是什么样的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

未定义标识符怎么解决