在某些编译模式下,编译器可能会假设针对在模块中使用却未在外部定义或声明的任何函数或变量,使用 int
类型。编译器的隐式 int
类型声明会将以此方式使用的任何类型为 long
的数据和指针截断。函数或变量的相应 extern
类型声明应置于头文件而非 C 模块中。然后,使用此函数或变量的任何 C 模块中应包含此头文件。如果是系统头文件定义的函数或变量,则仍然需要在代码中包含正确的头文件。
例如,由于未声明 getlogin(),因此以下代码:
int main(int argc, char *argv[]) { char *name = getlogin() printf("login = %s\n", name); return (0); }
将生成以下警告:
warning: improper pointer/integer combination: op "=" warning: cast to pointer from 32-bit integer implicitly declared to return int getlogin printf
要获取更好的结果,请使用:
#include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { char *name = getlogin(); (void) printf("login = %s\n", name); return (0); }