相关疑难解决方法(0)

C的有用GCC标志

除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?

我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.

c gcc compiler-flags

154
推荐指数
18
解决办法
6万
查看次数

选择静态代码分析工具

我正在开发一个项目,我在UNIX环境中用C编码.我一直在使用lint工具来检查我的源代码.Lint已经存在了很长时间(自1979年以来),任何人都可以建议我可以使用更新的代码分析工具吗?优选地是免费的工具.

c unix testing

60
推荐指数
6
解决办法
5万
查看次数

C中的隐式函数声明

术语"函数的隐式声明"是什么意思.调用标准库函数而不包括相应的头文件会产生警告,如果的话

int main(){
  printf("How is this not an error?");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果不声明它是错误的话,不应该使用函数吗?请详细解释.我搜索了这个网站,发现了类似的问题,但找不到明确的答案.大多数答案说了一些关于包含头文件以摆脱警告的事情.但我想知道这不是一个错误.

c

43
推荐指数
4
解决办法
10万
查看次数

你最喜欢的g ++选项是什么?

我是C++编程的新手.编译时我从不使用任何选项.

这是我的日常命令:

g++ MyCode.cc -o MyCode
Run Code Online (Sandbox Code Playgroud)

对于安全实践,最好的选择是什么?

c++ unix compiler-construction gcc g++

26
推荐指数
8
解决办法
1万
查看次数

最严格的C代码的GCC选项?

应该设置哪些GCC选项以使GCC尽可能严格?(我的意思是尽可能严格)我在C89写作并希望我的代码符合ANSI/ISO标准.

c gcc iso ansi strict

21
推荐指数
2
解决办法
1万
查看次数

在Windows中使用cygwin编译的C程序,在Linux下进行分段故障.cygwin GCC'糟糕'吗?

对于我的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 gcc cygwin

13
推荐指数
2
解决办法
8061
查看次数

建议使用gcc构建C++的-W标志

我一直在寻找对C的警告选项的推荐G ++名单++,只有能找到这样的:对于C推荐GCC警告选项有用的GCC标志对C这些都是非常特定于C

-Wall和-Wextra启用gcc可以生成的大多数但不是全部警告.

哪些选项未启用哪些警告特别是在编译C++时也应该打开?

c++ gcc build-process compiler-warnings

11
推荐指数
1
解决办法
6814
查看次数

如何禁用GNU 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

7
推荐指数
1
解决办法
3364
查看次数

g ++警告:永远不会被执行

继承了一个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++ gcc-warning gcc4

5
推荐指数
1
解决办法
4380
查看次数

推荐的 GCC 版本构建标志

我为我的 C++ 项目使用自定义 make 文件。我正在为发布版本寻找最推荐的编译标志。我目前正在使用以下内容:

CXXFLAGS += -O3 -Wall -DNDEBUG

我认为以上内容就足够了,但后来我尝试在二进制文件上运行“strip”工具,它大大缩小了大小。看起来二进制文件中仍然有一些非必要的东西。

我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的通用设置。我知道默认情况下 gcc 甚至不会丢弃死代码——我想尽快弄清楚如何做到这一点。

作为参考,我的 make 设置是https://github.com/YasserAsmi/buildmk

c++ gcc

5
推荐指数
1
解决办法
7060
查看次数

没有在范围内定义原型的函数的编译器警告?

[ 此答案的注释线程启发了这个问题。]

众所周知,自C99以来,调用未声明的函数(最好使用适当的原型)是一个错误。

但是,除此之外,如果我定义的函数在范围内没有原型声明,并且希望包含在调用者使用的同一头文件中,那么我希望编译器警告我。(除非该函数是静态的,否则所有这些都是没有意义的。)

原因应该很明显:如果标头中包含原型声明,并且所有调用者都包含该声明,但是该声明未包含在定义函数的文件中,并且如果该函数的实际定义与外部原型有所不同,则代表调用者完成的所有原型检查都是毫无价值的,实际上适得其反。有一个明显的错误,但是并不能保证完全被抓住。

有通用的编译器可以检查吗?我用-Wall尝试了gcc和clang,但他们没有。(我可以想象,如果Gimpel皮棉仍然存在,它会这样做,但我没有副本。)

理想情况下,我希望它也坚持认为原型存在于单独的头文件中,但是那是一回事,所以我不必坚持。(之所以做出这样的附加规定,是因为一些程序员对假设的警告消息感到厌倦,他们可能会试图通过在.c包含该定义的文件顶部键入一个外部原型来使其静音,这又会破坏目的。 )

c lint compiler-warnings gcc-warning function-prototypes

4
推荐指数
1
解决办法
522
查看次数

strtoull和长期算术

任何人都可以解释这个程序的输出以及我如何解决它?

unsigned long long ns = strtoull("123110724001300", (char **)NULL, 10);
fprintf(stderr, "%llu\n", ns);

// 18446744073490980372
Run Code Online (Sandbox Code Playgroud)

c string long-integer

2
推荐指数
1
解决办法
9650
查看次数