特定のコンパイルモードのコンパイラは、モジュールに使用されかつ extern
として定義または宣言されていない関数または変数に対してそのデータ型を int
とみなします。long
およびポインタがこのように使用された場合、コンパイラの暗黙的な int
宣言によって切り捨てられます。関数または変数に対する適切な 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); }