参考書のサンプルプログラムを見ると、よく、変数(関数)名の頭に_(アンダーバー)が付いているのがあります(_hensuu, _Function とか)。プログラムの書き方は人それぞれだと思いますが、よく見かけるのでなんとなく気になりました。どんなとき_(アンダーバー)を付けようと思いますか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No.1 の方の使い方は、逆ですね。



Cの規格(ANSI)では、アンダースコア "_" で始まる単語は予約語だと
考えなさい、となってます。

たまたま、今、使っているコンパイラでは _hensuu が予約語になっていなくても、
それは *たまたま* でしかなく、将来、コンパイル or リンクエラーになっても、
文句を言えません。

でも、良く使われてますよね。参考書のサンプルに使われているのなら、その
参考書に書いてあることは、話半分で読んだ方が良いと思います。他にも、そういう
レベルの間違いがたくさんあるだろうから。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考書が間違ってることもあるんですね。

お礼日時:2001/06/19 21:43

a-kumaさんのおっしゃるとおりですね。



ちなみに昔、一部のOSのシステムコール関数なんかは名前の頭にアンダーバー
がついていました。

参考書ってよく間違いを堂々と説明しているものなのでとりあえず流して全体
を把握する程度にしておき、後からANSIの本を読むなりした方がいいと思います
よ。
    • good
    • 0
この回答へのお礼

ありがとうございます。ANSIの本を読んでみます。

お礼日時:2001/06/19 21:50

変数名を「当たり前」の名前にしたとき、予約語に当たるかな?という場合。



あと、変数の一覧を作成したとき、上位に出て欲しい場合、でしょうか。

でも、最近はハンガリアン記法でやってますね。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2001/06/19 21:38

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qアンダーバーとバックスラッシュ

くだらないことですが、ふと気になったので質問させてください.
人様のソースをのぞいていると、

_abcd
_abcd_
abcd_

という変数のつけ方をよく見かけます.
一番上に関しては予約語だったり、昔のシステムコール等についていたということを過去ログを見て知ったのですが、両端や右端につける場合も同じような理由なのでしょうか?

あともうひとつはプログラミングとさほど関係ありませんが。。

ASCIIの半角バックスラッシュ(\)はwindowsの日本語フォントでは殆どの場合 円マーク(\)となりますが、欧州、中国とかだと、これがその国の通貨のマークに変わったりするのでしょうか? 円マークは日本だけですか?

お馬鹿な疑問ですがよろしくお願いします。

Aベストアンサー

xcrOSgS2wYさんの言われる「普通のものではない」ということから思い出したことがあります。

実は、C++(および一定の条件を満たすC)では、識別子に($)を使うことができます。これは特定のコンパイラの拡張機能ではなく、(概ね)標準の機能です。
というのは、C++では基本ソース文字集合にない文字がソース中に現れると、国際文字名に変換されてコンパイルされます(厳密にいうと、標準に準拠しているなら変換されるはずです)。漢字などは対応する文字コードに強く依存しますが、($)の場合は比較的互換性があります。

国際文字名に完全対応しているコンパイラは実際にはあまりありませんが、($)に限っては、GCCも、VC++も、もともと拡張機能として使用することができます。経緯はどうであれ、現在では、識別子中の($)を国際文字名に変換されるはずの拡張ソース文字集合の中の1文字であると主張してもあながち間違いではなさそうです。

主要な処理系が、国際文字名にまともに対応するようになれば、やむを得ず予約済みの識別子を使ってしまうこともなくなりそうです(なくなって欲しい)。

ちなみにVC++8.0では、識別子に漢字なども普通に使えるようです。

xcrOSgS2wYさんの言われる「普通のものではない」ということから思い出したことがあります。

実は、C++(および一定の条件を満たすC)では、識別子に($)を使うことができます。これは特定のコンパイラの拡張機能ではなく、(概ね)標準の機能です。
というのは、C++では基本ソース文字集合にない文字がソース中に現れると、国際文字名に変換されてコンパイルされます(厳密にいうと、標準に準拠しているなら変換されるはずです)。漢字などは対応する文字コードに強く依存しますが、($)の場合は比較的互換...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qintとlongは同じ?

#include <stdio.h>
#include <limits.h>

int main() {
printf("%d\n%d", INT_MAX, LONG_MAX);
return 0;
}

出力
214783647
214783647

Win7 64bit (VC++2010)
CentOS 32bit (gcc)

どちらの環境でも同じ出力結果となりました。
intとlongなぜ同じになってしまったのでしょうか。

Aベストアンサー

long は 32ビットの整数(signedの場合 -2147483648~+2147483647、unsignedの場合
0~4294967295)
int は システムにおける 標準
という定義です。

32ビットシステムの場合は同じになります。

DOS時代はシステムが 16ビットのため、intは -32768~+32767(または 0~65535)でした。

short int とすることで 16ビット互換となります。

Q'_'(アンダースコア)の使い方について

グローバル関数や__constructなどの決め事以外で文字列の頭に'_'(アンダースコア)を付けることがありますが、あれには何か”暗黙の了解”のようなルールがあるのでしょうか?

例えばクラス名で
class _Member
関数名で
public function __toString()
変数名で
$this->_member
などなど。

初心者なもので、よろしくおねがいします。

Aベストアンサー

主にシステムで使用する変数は、そのようになっている場合が多いです。
内部変数ならば何でも問題ないですが、グローバル変数やグローバル関数などは、重複が許されません。
かと言って、わかりづらい変数名では、いざ使う時に使いづらいです。
と、言うことでなるべく重複しないように暗黙のルールで先頭に1つ2つアンダースコアを付けています。

逆に言えば、ユーザーは先頭にアンダースコアを付けなければ、まずシステム変数・システム関数などと重複することはまず無いと言うことです。
(但し、普通に公開されているシステム変数・システム関数は別です)

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Q変数名の付け方

変数名の前にアンダーバー「_」をつけて「_hensu」などどしている変数名がありますが、このアンダーバーはどんな意味があるのでしょうか。
昔からある何かの習慣なのでしょうか。

Aベストアンサー

インスタンス変数につける場合がありますね。
逆に、「ローカル変数につける!」 という人も見かけますし…
とりあえず、スコープの違いを分かりやすくする目的であることが多いです。

オープンソースのコードや業務で見るコードでも、Javaではあまり多数派ではないと思います。
よく見かけるのは、JavaScriptなどのアクセス修飾子がない言語です。
「"_"がついてるメンバには直接アクセスしない」などのルールを積極的に使ったりします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報