除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?
我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.
我正在开发一个项目,我在UNIX环境中用C编码.我一直在使用lint工具来检查我的源代码.Lint已经存在了很长时间(自1979年以来),任何人都可以建议我可以使用更新的代码分析工具吗?优选地是免费的工具.
术语"函数的隐式声明"是什么意思.调用标准库函数而不包括相应的头文件会产生警告,如果的话
int main(){
printf("How is this not an error?");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果不声明它是错误的话,不应该使用函数吗?请详细解释.我搜索了这个网站,发现了类似的问题,但找不到明确的答案.大多数答案说了一些关于包含头文件以摆脱警告的事情.但我想知道这不是一个错误.
我是C++编程的新手.编译时我从不使用任何选项.
这是我的日常命令:
g++ MyCode.cc -o MyCode
Run Code Online (Sandbox Code Playgroud)
对于安全实践,最好的选择是什么?
应该设置哪些GCC选项以使GCC尽可能严格?(我的意思是尽可能严格)我在C89写作并希望我的代码符合ANSI/ISO标准.
对于我的Programming 102类,我们被要求提供在Linux下编译和运行的C代码.我的硬盘驱动器上没有足够的空间来安装Linux和Windows,因此我使用cygwin编译我的程序.
我必须提供的最新程序编译并在cygwin下正常运行.它在Linux下编译很好,但执行中途会产生分段错误.我向给我们上课的研究生解释了这一点,他说cygwin的GCC版本允许编写和执行更粗糙的代码.
我通过谷歌找到的少数参考文献尚无定论.我找到的一个帖子说Linux下的seg故障原因是内存泄漏.为什么这不会影响cygwin版本?
我会使用大学的计算机,但我不能在他们身上使用Subversion,这会严重阻碍我的努力.(我是编码的新手,通常需要能够恢复到X修订版).
cygwin的GCC版本是否真的对它编译的代码更"松懈"?如果是这样,编码时是否有任何明显的问题需要注意?是否有任何替代方法可以编写将在Linux下运行的代码?
编辑
谢谢你的回复.我在原帖中没有明确表示:我的代码中有一个错误对我来说非常重要(我对编程很陌生,毕竟C语言真的很绿).我的TA暗示cygwin的GCC是一个不太可靠的编译器 - 比起在GNU/Linux下发现的代码要运行得更多.我发现这很奇怪,所以在互联网上搜索,但实际上找不到任何对这个事实的引用.
不仅仅是责怪编译器和我的代码,我想知道程序在Windows下运行并在Linux下崩溃的原因是什么.回复:在这方面说明了Windows/Linux下的不同内存管理器和堆/堆栈布局.
结论是cygwin的GCC和GNU/Linux一样"好",它是底层操作系统/纯粹的运气,我的错误程序运行在一个而不是另一个是非常正确的吗?
关于发布源代码,这是一个家庭作业,所以我更愿意自己找到问题,如果可能的话:)
编辑2
我接受了jalf的答案,因为它讨论了什么使程序在Windows下而不是在Linux下运行,这是我真正想知道的.感谢所有贡献的人,他们都是非常有趣和内容丰富的回复.
当我发现问题并修复它时,我会上传一个包含这个非工作版本的所有源代码的zip文件,万一有人好奇地看到我到底做了什么:)
编辑3
对于那些有兴趣看到代码的人,我发现了问题,这确实是由于指针.我试图从函数返回一个指针.我试图返回的指针正在函数内部声明,因此在函数执行后被销毁.问题代码在第22-24行注释掉.
随意嘲笑我的代码.
/**
* Returns array of valid searches based on current coordinate
*/
void determine_searches(int row, int col, int last_row, int last_col, int *active_search){
// define coordinate categories and related valid search directions
int Library0[] = {2, 3, 4, -1};
int Library1[] = {4, 5, 6, -1};
int Library2[] = {2, 3, 4, 5, 6, -1};
int Library3[] = {0, 1, 2, …Run Code Online (Sandbox Code Playgroud) 我一直在寻找对C的警告选项的推荐G ++名单++,只有能找到这样的:对于C推荐GCC警告选项和有用的GCC标志对C这些都是非常特定于C
-Wall和-Wextra启用gcc可以生成的大多数但不是全部警告.
哪些选项未启用哪些警告特别是在编译C++时也应该打开?
正如您在以下代码中看到的,我在以下代码中引入了嵌套函数main():
#include <stdio.h>
int main(){
int a=5;
printf("%d\n",a);
{
int a=10;
printf("%d\n",a);
}
printf("%d\n",a);
//Nested function
int main(int a){
if(a>0)printf("%d\n",a--);
return 0;
}
main(7);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我使用-std=c99gcc中的标志来"禁用"不必要的扩展,但我没有得到任何错误.
gcc temp3.c -std=c99 -o temp3.out
我在哪里弄错了?
继承了一个C++项目.我正在使用gcc 4.1.2通过makefile在RHEL 5.5中构建.该项目是巨大的(数百个文件),一般来说代码非常好.但是,在编译期间,我经常会收到GCC警告:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h: In constructor ‘std::allocator<_Alloc>::allocator() [with _Tp = char]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:97: warning: will never be executed
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:97: warning: will never be executed
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In constructor ‘__gnu_cxx::new_allocator<_Tp>::new_allocator() [with _Tp = char]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:65: warning: will never be executed
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h: In destructor ‘std::allocator<_Alloc>::~allocator() [with _Tp = char]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:105: warning: will never be executed
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In destructor ‘__gnu_cxx::new_allocator<_Tp>::~new_allocator() [with _Tp = char]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:72: warning: will never be executed
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h: In copy constructor ‘std::allocator<_Alloc>::allocator(const std::allocator<_Alloc>&) [with _Tp = char]’:
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:100: warning: will never be …Run Code Online (Sandbox Code Playgroud) 我为我的 C++ 项目使用自定义 make 文件。我正在为发布版本寻找最推荐的编译标志。我目前正在使用以下内容:
CXXFLAGS += -O3 -Wall -DNDEBUG
我认为以上内容就足够了,但后来我尝试在二进制文件上运行“strip”工具,它大大缩小了大小。看起来二进制文件中仍然有一些非必要的东西。
我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的通用设置。我知道默认情况下 gcc 甚至不会丢弃死代码——我想尽快弄清楚如何做到这一点。
作为参考,我的 make 设置是https://github.com/YasserAsmi/buildmk
众所周知,自C99以来,调用未声明的函数(最好使用适当的原型)是一个错误。
但是,除此之外,如果我定义的函数在范围内没有原型声明,并且希望包含在调用者使用的同一头文件中,那么我希望编译器警告我。(除非该函数是静态的,否则所有这些都是没有意义的。)
原因应该很明显:如果标头中包含原型声明,并且所有调用者都包含该声明,但是该声明未包含在定义函数的文件中,并且如果该函数的实际定义与外部原型有所不同,则代表调用者完成的所有原型检查都是毫无价值的,实际上适得其反。有一个明显的错误,但是并不能保证完全被抓住。
有通用的编译器可以检查吗?我用-Wall尝试了gcc和clang,但他们没有。(我可以想象,如果Gimpel皮棉仍然存在,它会这样做,但我没有副本。)
理想情况下,我希望它也坚持认为原型存在于单独的头文件中,但是那是一回事,所以我不必坚持。(之所以做出这样的附加规定,是因为一些程序员对假设的警告消息感到厌倦,他们可能会试图通过在.c包含该定义的文件顶部键入一个外部原型来使其静音,这又会破坏目的。 )
任何人都可以解释这个程序的输出以及我如何解决它?
unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);
// 18446744073490980372
Run Code Online (Sandbox Code Playgroud)