在没有stdlib未定义行为的情况下调用atoi?

时间:2015-06-04 13:10:51

标签: c

在没有的情况下调用atoi 包括stdlib.h未定义的行为? 即使我使用了stdlib.h,我也无法找到我在项目中包含atoi的位置。 事情实际上atoi已经正常工作 - 每次使用软件时它都正确解析整数。 它是一些嵌入式设备。 那么有没有明确的定义呢?

顺便说一句。在这一行:

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
#include "sdkGlob.h"


#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */

该标题包含stdlib.h但我无法理解它包含在哪种情况下。而且我不确定这个cplusplus是否在任何地方定义。无论如何,这是一个c项目。

2 个答案:

答案 0 :(得分:3)

在C99之前,可以使用之前未声明过的函数。编译器可能会生成一个警告,但是在链接器找不到该函数或找到一个具有除编译器猜测之外的签名的同名函数之前,不会出现错误。幸运的是,编译器总是猜测返回类型为int

在C99中,函数声明必须可见,但并非所有编译器都严格执行该规则。

根据Random832的评论,sdkGlob也很可能仅包含stdlib

至于你的另一个问题:sdkGlob总是包含在内但是如果通过C ++编译器而不是C编译器运行,你也会得到extern "C"{ .. }包装。这告诉C ++编译器不要破坏名称,以便您可以链接使用普通C编译器构建的该模块的版本。这是以允许C和C ++代码使用它们的方式提供普通C库的常规方法。

答案 1 :(得分:2)

简短回答

两种可能性:

  • sdkGlob.h可能包含stdlib.h或定义自己的atoi版本。
  • 某些编译器(如GCC)解决了丢失#include甚至隐藏错误或警告的问题。运行gcc -Wall并检查是否出现警告。

关于ifndef

C ++编译器使用#ifdef __cplusplus部分。在这里,你说'*如果只是代码是由C ++编译器编译的,那就做...... *'。

代码的纯C版本:

#include "sdkGlob.h"

C ++版本的代码:

extern "C"{
  #include "sdkGlob.h"
}