相关疑难解决方法(0)

c中"auto"关键字的概念

能否请你在C程序中给出关键字"auto"的确切概念.

当我读完一本书"Deep C secrets"时,得到了以下引用.

auto关键字显然毫无用处.它只对在符号表中创建条目的编译器 - 写入器有意义 - 它表示此存储在进入块时自动分配(与全局静态分配或堆上的动态分配相反).Auto与其他程序员无关,因为默认情况下你会得到它.

c keyword

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

如何将$ CC中的"隐式声明"警告转换为错误?

(我在1993年左右开始编写C程序.当时时间不同,编译器可能有所不同,但我记得当一个人试图引用未声明的C函数时,会出现错误.另外,如果稍后定义该函数,可能在另一个翻译单元中,并且"签名"不匹配,则会出现另一个错误.)

我目前正在使用GCC 4.4.3.我很困惑为什么GCC对我(在示例中故意)不匹配(可选)声明bar和它的定义很宽容,bar.c其中显然会导致致命bar的地址错误 - 因为想要一个地址并给出一个整数,它结束取消引用该整数作为地址.一个严格的编译器,或者我认为,会因为错误而中止我.我错过了什么吗?我的构建命令行如下:

cc -o foobar -g -Wall -std=c99 -fexec-charset=ISO-8859-1 -DDEBUG foo.c bar.c
Run Code Online (Sandbox Code Playgroud)

foo.c:

int main()
{
    int a;

    bar(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且bar.c:

void bar(int * a)
{
    *a = 1;
}
Run Code Online (Sandbox Code Playgroud)

我故意省略了声明bar并且故意传递了一个整数(可能是真的)而不是地址,因为它的实际定义需要.我的底线是:因为$(CC)不会阻止我,我最终会出现分段错误(x86,Ubuntu 10.04).我知道一个兼容的C(C99?)编译器会隐式创建一个int bar(void)声明,bar如果没有找到,但在这种情况下,这显然不是我想要的!我想保护自己免受各种错误的影响,因为我犯了人为错误的声明和定义不匹配或完全省略了前者.

我尝试使用-c编译器开关代替仅编译 - 但它并不重要,因为它仍然成功发出警告.虽然连接器可能会禁止,但我希望编译器在发生之前阻止我.

并不真的想谈谈我的警告与错误的说-Werror,这是因为:

  • 我本可以float bar(double a);在顶部包含错误foo.c,这完全消除了警告,但不会改变生成的程序崩溃的事实.唉,一个程序可以在没有警告的情况下成功编译(即使使用-Wall开关),并且在运行时可以很好地崩溃.
  • 我已经并且将会有其他类型的警告应该保持警告而不是阻止成功构建.
  • 它将处理问题的影响,而不是问题本身
  • 它不仅仅是警告的类型,还包括特定的实例.我不想将特定的警告代码变成错误,因为在某些情况下,这不适用.这将是一个过于粗略的解决方案,它没有考虑警告发生的具体情况和背景.

c gcc

9
推荐指数
2
解决办法
8190
查看次数

标签 统计

c ×2

gcc ×1

keyword ×1