首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我应该使用"-ansi"或显式"-std = ..."作为编译器标志吗?

问题: 是否应该使用 "-ansi" 或显式 "-std=..." 作为编译器标志?

答案:

在编程时,根据不同的编译器和操作系统,使用相应的编译标志是很重要的。在 C 和 C++ 的编程中,通常需要使用以下两种方式之一来指定编译器标志:

  1. 使用 "-ansi" 参数。这个参数告诉编译器遵循 ANSI C89 标准,该标准定义了 C 语言的一种实现方式。这种方式适用于需要兼容老式 C 程序的平台,例如 Linux 系统。
  2. 使用显式的 "-std=..." 参数。这种方式允许你指定要使用的 C 语言标准版本,例如 "-std=c90" 表示使用 C90 标准。这种方式适用于需要指定更严格或更现代化的编译器行为的平台,例如 Windows 系统。

此外,不同的编译器可能还有自己的特定标志,例如 GCC 编译器可以使用 "-std=c90" 标志,而 Clang 编译器则可以使用 "-std=c11" 标志。

因此,你应该根据你的项目需求以及所使用的编译器来选择最合适的方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数字硬件建模SystemVerilog(八)-端口声明

端口方向用关键字input、outputinout声明, port类型和数据类型可以是变量,也可以是之前介绍的任何网络类型和数据类型。 端口标志可以是有符号的,也可以是无符号的。...端口声明继承规则包括: 继承的端口方向-端口方向声明在指定新方向之前保持有效,即使端口类型发生更改。 继承的端口类型-在指定新的方向类型之前,端口类型声明保持有效。...继承的端口数据类型-在指定新的方向、类型数据类型之前,端口数据类型声明保持有效。...继承的端口有无符号-端口有无符号声明在指定新的方向类型数据类型大小之前保持有效, 继承的端口大小-在指定新的方向类型数据类型大小之前,端口大小声明保持有效。...传统的Verilog会为所有端口假定一种端口类型wire,除非该端口被声明为reg,这将推断出一个变量。工程师必须小心地使用端口声明,以确保每个端口具有模块内功能的正确类型和数据类型。

2.1K50

C++类自动提供的特殊成员函数

默认样式: className() { }//初始化值随机 若想创建对象时不显的对它进行初始化,则必须的定义默认构造函数: //例如: Klunk::Klunk()...最常⻅的情况是将新对象地 初始化为现有的对象。...每当程序⽣成了对象副本时,编译器都将使⽤复制构造函数。 - 当函数**按值传递对象**(如程序清单12.3中的callme2())**函数返回对象**时,都将使⽤复制构造函数。...**编译器⽣成临时对象时,也将使⽤复制构造函数。** 由于按值传递对象将调⽤复制构造函数,因此应该按引⽤传递对象。这样可以节省调⽤构造函数的时间以及存储新对象的空间。...浅复制将导致相同地址重复删除,造成数据受损 如果操作结果是不确定的,则执⾏的操作将随编译器⽽异,包括⽰独⽴声明 (Declaration of Independence)释放隐藏⽂件占⽤的硬盘空间。

71110
  • 日更系列:使用函数指针的小伎俩

    这个接口函数可以是普通函数,类的静态函数,类的成员函数可以? 三、使用类的成员函数作为函数指针可以 再来看一个例子: 我们有1个接口类,和个实现接口类的实现类。...truncated_calculator_vec) { truncated_calculator_vec->IsTruncated(item); } } 好了,这里我们继续扩张do的逻辑,然后认为需要遵守函数的单一指责原则...然后在do里面另分出一个truncate函数,然后把truncated_calculator_vec->IsTrancated传递过去,这样是否可行,能这样写?...在实现方面,编译器不能使用简单的函数地址,因为你不知道要调用的地址(想想虚函数)。当然,还需要知道对象才能提供this隐参数。 如果要提供指向现有代码的函数指针,应该编写类的静态成员函数。...静态成员函数不需要this,因此需要将该对象作为参数传入。 但是如果非要传入成员函数咋办,因为有时候成员函数会改变类的一些成员变量,不能静态化。

    71760

    令人沮丧的C++性能调试

    Clang 接受了这个标志,但它与 -O1 完全相同——LLVM 维护者从未实现过恰当的调试优化级别。MSVC 没有与 -Og 相对应的东西,而大多数游戏开发者使用 MSVC 作为他们的主要编译器!...文档提到它应该是默认启用的,但如果不手动指定标志,就无法让编译器执行折叠——请参考 Compiler Explorer 上的示例(https://gcc.godbolt.org/z/KPGe3YYsG...支持编译器用一些非常规手段,但规则应该更通用一些。...在一个已经完全不可读的代码库中加入非常小的可读性,这真的是不值得做这些变更的理由认为不是。 关于问答  问:人们应该写出包含更少 Bug 的代码,这样他们就不需要调试了!...此外,许多构建系统可能不容易支持这种基于单个文件的优化标志可以想象,在较老的代码库专有 / 遗留构建系统中实现这个想法可能会非常困难。

    98420

    Chapter 2: auto

    1.更多的使用auto而不是类型声明 将大段声明缩减成auto 例如: typename std::iterator_traits::value_type currValue = *b;...因此,正确的用法如下: auto sz = v.size(); 使用auto声明变量来避免类型不匹配时的隐转换带来的额外代价 例如: std::unordered_map<std::string,...正确的做法应该是: for( const auto& p : m) { ... // as before } 有关代码可读性的建议: 如果使用显示类型声明使得代码更清晰且更容易维护,那么就应该使用显示类型声明...2.当auto推导出错误类型时使用类型初始化方式 当表达式返回的类型是代理类的类型时,不能使用auto 例1: //提取出Widget对象的特征,并以vector的形式返回 //每一个...,同时增强程序可移植性和减少重构复杂性;但也由于与隐代理类的冲突,造成了一些潜在问题,但是这些问题不是auto引起的,而是代理类本身的问题,因此静态类型转换可以保留auto的优点,同时保证程序的正确性

    1.1K70

    C ++ 中不容忽视的 25 个 API 错误设计!

    如果你正在使用C ++,那么你应该只在命名空间中对API功能进行分组,让编译器为你完成繁重的任务。 还强烈建议你使用嵌套命名空间来进行功能分组将公共API与内部API分开。...只需标记不作为noexcept抛出的API。 错误#6:不将单个参数构造函数标记为 为什么这是一个API设计错误? 允许编译器进行一次隐转换以将参数解析为函数。...,因为现在编译器不会将第一个参数的类型强制为向量对象。...,即它应该地#includeforward声明它需要编译的类型/结构。...错误#18:从一开始就没有决定静态动态库的实现 无论你的客户更喜欢静态库还是动态链接库,都应该决定你的很多设计选择。例如: 你可以在API接口中使用STL类型

    1.5K20

    《改善C程序代码的125个建议》-防止整数类型产生回绕与溢出

    当然,在一个把字符当做整数值的处理程序中,可以地把这类变量声明为signed charunsigned char,从而确保不同的机器中在字符是否为有符号值方面保持一致,以此来提高程序的可移植性。...建议2-2:使用声明为signed charunsigned char的类型来执行算术运算 在讨论本建议话题之前,我们先看看下面的这段代码的输出结果,如代码清单1-1所示。...解决这种问题的办法很简单,就是地将char类型的变量c声明为signed charunsigned char类型,这样可保证结果的唯一性,如代码清单1-2所示。.../c=%d\n", i/c); return 0; } ---- 这样就地将char类型的变量c声明为unsigned char类型,现在,后面的除法运算(i/c)与char的符号无关,所以代码清单...建议2-3:使用rsize_tsize_t类型来表示一个对象所占用空间的整数值单位 C语言标准规定size_t是一种无符号整数类型,编译器可以根据操作系统的不同而用typedef来定义不同的size_t

    1.9K70

    C++ 协程篇一:co_yield和co_return

    上个世纪,Doug McIlroy 和 Ken Thompson发明了 Unix 管道作为连接并发进程的一种方式。McIlroy 编写了一页的 C 版本的 Sieve,它使用 Unix 进程和管道。...---- 输出 构建并运行完整的 C++ 文件,如下所示: "-fno-exceptions"标志简化了一些 C++程序使用异常的流程。...---- co_yield 这是一个协同程序(而不是常规函数),因为它的主体中至少有一个co_yieldco_return。...Generator将负责销毁协程框架(剧透警报:它将在其析构函数中完成,通过std::coroutine_handle传递给其构造函数)。...它 resume协程,运行到下一次暂停(在co_yieldfinal_suspend隐之后co_return;后者意味着协程是done)。

    2.1K30

    C语言之一维数组

    int num[3]; 数组名 我们大多数时候都会使用到数组名。但是你真的清楚数组名是什么类型? 首先,num[1]毫无疑问是int类型,那么num是什么类型?它到底表示了什么?...例如num,它的类型应该是指向int类型的指针常量。但是这并不是说数组和指针是相同的。当数组名在表达式中使用的时候,编译器会给它产生一个指针常量。...例外情形 当数组名作为sizeof操作符或是&(取地址)操作符的操作数时。 sizeof(num); 返回整个数组的长度,而不是指针的长度。故应该返回12,而不是指针的大小。...因为,数组名在作为函数参数进行传递的时候,实际上一个指针。   不过编译器为了我们编写代码方便, 支持数组形式的函数形参。因此,下面的两种形式声明是等价的。...因为这传递的是指针,而不是整个数组,所以,如果函数需要知道数组的长度,那么长度必须作为一个的参数传递给函数。

    63320

    如何设计一个C++的类?

    tips:类的名字应该明确告诉用户这个类的用途。 类需要自己写构造函数和析构函数?...看下百度百科的定义: 默认构造函数(default constructor)就是在没有提供初始化时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。...这个很明确,如果类会作为基类被派生时,该基类的析构函数就一定要声明为虚函数,如果某个类确定不会被派生,那就不要声明其析构函数为虚函数。 类需要提供拷贝构造函数?...什么时候使用explict避免隐转换? explict多数情况下用于修饰只有一个参数的类构造函数,表示拒绝隐类型转换。那什么时候使用explict关键字呢,还是看情况。...个人习惯最多四个,超过四个一般就会封装到一个结构体作为参数传递。

    1.5K20

    opencl:C++11下使用别名(x,y,z,hi,lo...)访问vector类型(cl_int2,cl_long16...)的元素

    ,如果编译代码时使用了-ansi选项,编译器就会定义__STRICT_ANSI__,找遍了整个项目代码,确信没有使用过-ansi(太高端从来不知道这个选项),所以并不是因为使用了-ansi才造成这个问题...,而是因为使用了-std=c++11选项导致编译器自动定义了__STRICT_ANSI__。...方案1: 第一个办法就是前述博客中最后提到的办法:在使用-std=c++11选项的同时,加上-U__STRICT_ANSI__选项, 用于去掉__STRICT_ANSI__定义 如果你是用cmake...来编译项目代码,可以在CMakeList.txt中加入这样的代码 #判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持,并去掉__STRICT_ANSI__定义 if(CMAKE_COMPILER_IS_GNUCXX...) 方案二 修改你的源代码,在#include #include 语句之前使用#undef __STRICT_ANSI__删除__STRICT_ANSI

    1.1K10

    剖析【C++】——类与对象(中)——小白篇—超详解

    defaultDate.display(); // 输出: 0-0-0 specificDate.display(); // 输出: 2024-5-28 编译器生成的默认构造函数 如果没有定义构造函数...当对象的生命周期结束时,C++编译器会自动调用析构函数。对于没有资源需要管理的类,可以使用编译器生成的默认析构函数;对于需要管理资源的类,必须定义析构函数以防止资源泄漏。...使用传值方式编译器会报错,因为会引发无穷递归调用。 若未定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数按内存存储字节序进行拷贝,这种拷贝叫做浅拷贝值拷贝。...若未定义,编译器会生成默认的拷贝构造函数,对内置类型进行浅拷贝,对自定义类型调用其拷贝构造函数完成拷贝。对于涉及资源管理的类,定义拷贝构造函数以实现深拷贝是必要的,以防止资源泄漏。...用户没有实现时,编译器会生成默认的赋值运算符重载,以值的方式逐字节拷贝。对于内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

    10810

    小白入门笔记:CMake编译过程详解

    需要,函数也应该具有对全局变量的读/写访问权。这种变量(作用域) 分离必须在多个层面上工作——当一个函数调用另一个函数时,分离规则同样适用。...配置时,可以为DebugRelease构建设置相关的选项属性,例如:编译器和链接器标志。控制生成构建系统使用的配置变量是CMAKE_BUILD_TYPE。...需要在运行CMake时地打印标志,也可以仔细阅读运行CMake --system-information的输出,以了解当前平台、默认编译器和语言的默认组合是什么。...:其中提供循环变量和项列表,以上例中的列表变量为例,当为sources_with_lower_optimization中的项打印编译器标志集时,使用此表单。...注意,如果项目列表位于变量中,则必须展开它;也就是说,${sources_with_lower_optimization} 必须作为参数传递。 e.g.

    5.8K31

    讲解error: jump to label

    解决方法要解决该错误,我们可以使用以下两种方法:方法一:添加 -fpermissive 标志在编译代码时,我们可以通过添加 -fpermissive 编译标志来告诉编译器容忍这种类型的跳转语句。...例如,在使用 g++ 编译器时,可以执行以下命令:bashCopy codeg++ -fpermissive source.cpp -o output通过添加 -fpermissive 标志编译器将容忍跳转语句...该函数接收用户名和密码作为参数,并与存储在数据库中的合法用户名和密码进行比较。根据比较结果,我们通过使用条件语句 (if-else) 来判断登录是否成功,并返回相应的结果。...-fpermissive 是 GCC (GNU Compiler Collection) 编译器的一个选项,用于宽容地处理一些不符合 C++ 标准的语法类型匹配问题。...要注意的是,使用 -fpermissive 选项可能会使一些本应该被视为错误的代码通过编译。在大多数情况下,我们建议尽量避免使用该选项,而是修复代码中存在的问题,以符合 C++ 标准和最佳实践。

    88010

    Rust vs C++:2024,谁更懂错误处理?

    「而Result 类型则是在操作可能成功失败,且想明确处理两种结果时使用。」 「它代表一个值,可以是 Ok(T),其中 T 是成功操作的结果,或者是 Err(E),其中 E 是发生的错误。」...异常,在main()函数中,没有捕获,难道C++编译器不报错?」...如果一个函数返回 Result 类型,你必须处理 Ok 和 Err,或者使用 unwrap()、expect() 等方法明确标明这里可能的错误不会被处理。...因为Rust强制开发者在编写代码时就考虑错误处理,而不是依赖于运行时的异常捕获机制。」 席双嘉点头说:「确实如此。或许,是时候拓宽的技术视野了。...而且,不论是 Rust 还是 C++,我们的目标都是写出更好的代码,不是?」 5 终曲 席双嘉笑着说:「行行行,认输。那件“安全第一,用Rust”T恤穿定了。

    42053
    领券