参考書のサンプルプログラムを見ると、よく、変数(関数)名の頭に_(アンダーバー)が付いているのがあります(_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と関連する良く見られている質問

Q英字キーボードでのアンダーバーの打ち方

英字キーボードをはじめて使ってるのですがアンダーバーが打てず、困ってます。助けてくださいー!!

Aベストアンサー

バックスラッシュ\をSHIFTすればでませんか?

Qstruct tanka_kosuu kosuu[10];に付いているアンダーバー"_"の意味

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10];
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
int i;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
for ( i = 0; i < nyuuryoku_kosuu-1; i++ ){
kosuu[i].kingaku = kosuu[i].tanka * kosuu[i].kosuu;
printf("%d\t%d\t%d\n", kosuu[i].tanka,
kosuu[i].kosuu, kosuu[i].kingaku);
}
printf("goukei=%d\n",goukei_kingaku(kosuu, nyuuryoku_kosuu-1));
return 0;
}
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu)
{
int i;
int goukei = 0;
for ( i = 0; i < nyuuryoku_kosuu; i++ ){
goukei += kosuu[i].kingaku;
}
return goukei;
}

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10...続きを読む

Aベストアンサー

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線で区切る "アッパーケース"

C言語の構造体の場合ですが、
慣習として スネークケース または キャメルケース あたりが一般的な様です。

というわけで質問の回答としては、
そのプログラムを作った人の命名規則が、構造体名はスネークケースだった。

ちなみに、
言語仕様的に使えないチェインケースを除いて、どの命名規則でもコンパイルエラーになることはありません。
ただし、コンパイラーとは別に静的コード解析をしている場合は、変な命名だと警告されるかもしれません。


以下参考です。

慣習の由来はたぶんこれ
http://www.amazon.co.jp/dp/4320026926

命名規則が パスカルケース または アッパーケース の例
https://msdn.microsoft.com/ja-jp/library/kbt00480.aspx

言語によっては、この手の命名規則についての公式ガイドラインがあります
http://www.oracle.com/technetwork/java/codeconventions-135099.html
https://msdn.microsoft.com/ja-jp/library/ms229043.aspx

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線...続きを読む

Qアンダーバーの打ち方を教えて

 パソコンに送信されてきたE-Mailを携帯に転送する必要が生じたのですが、携帯のURLにアンダーバーを使用していることから、転送できずに困りました。ハイフンでは届かずチルダでもない。メールのは確かに下に1字分の下線があるのですが・・・よろしくお願いいたします。

Aベストアンサー

Shiftキーを押しながら「ろ」のキーを押せばいいだけですが

転送なら、いちいち入力しないでコピー&ペーストしたほーが簡単で確実ですよ

Qこのプログラムを見てください(C言語) m( _ _ )m

現在乱数を使ったプログラムを作っています。

下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int ran, a=1, b, c;

void test(void){
b=8;
}
void main(){
srand(time(NULL));
a=b;//ここを無くすとなぜかエラーが出ない。
while(1){
ran=rand()%(a*2)+1;
switch(ran){
case 1: c=1; break;
case 2: c=1; break;
case 3: c=1; break;
case 4: c=2; break;
case 5: c=2; break;
case 6: c=3; break;
case 7: c=3; break;
case 8: c=4; break;
}
printf("%d",c);printf("何か押してください\n");getch();
}
}

現在乱数を使ったプログラムを作っています。

下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int ran, a=1, b, c;

void test(void){
b=8;
}
void main(){
srand(time(NULL));
a=b;//ここを無く...続きを読む

Aベストアンサー

a=b

の実行時に変数bが参照されますが、

値が不定です。

test()がa=b以前に実行されていればOKです。

Q半角のアンダーバーの入力の方法を教えて下さい。

半角のアンダーバーの入力の方法を教えて下さい。
アンダーバーの呼び方も教えて下さい。
(2695_1042)

Aベストアンサー

アンダースコアと言います。

半角モードにして、右のShiftキーの隣のキーをShiftを押しながらです。

Qpthread_cond_waitとptherad_cond_signal

pthread_cond_waitで寝ているthreadに対して、ptherad_cond_signalにて起こして、そのthreadが再度寝るまでの間にpthread_cond_signalが複数回(2回として)Callされた場合、どのような挙動になるのでしょうか?

最初のSignalをA、以下B,Cとすると
A->cond_wait->B->cond_wait->C
となるのでしょうか?

宜しくお願い致します。

Aベストアンサー

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut_sub_th = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_sub_th = PTHREAD_COND_INITIALIZER;
int main_sleep_time;
int sub_sleep_time;

void  sub_print(char *name,char *msg,int ctr)
{
  pthread_mutex_lock(&mut_sub_print);
  printf("%s:%s(%d)\n",name,msg,ctr);
  fflush(stdout);
  pthread_mutex_unlock(&mut_sub_print);
}
void  *sub_thread(void *adddr)
{
  int   ctr = 0;
  pthread_mutex_lock(&mut_sub_th);
  while(1){
    pthread_cond_wait(&cond_sub_th,&mut_sub_th);
    ctr++;
    sub_print("sub","con_wait終了",ctr);
    usleep(sub_sleep_time*1000);
  }
  return NULL;
}
// 第1パラメータにメインスレッドのスリープ時間(ミリ秒)
// 第2パラメータにサブスレッドのスリープ時間(ミリ秒)
int main(int argc,char **argv)
{
  int ret;
  int i;
  int ctr = 0;
  pthread_t  tid;
  if (argc != 3){
    printf("%s P1 P2\n",argv[0]);
    printf("P1:メインスレッドのスリープ時間(ミリ秒)\n");
    printf("P2:サブスレッドのスリープ時間(ミリ秒)\n");
    exit(1);
  }
  main_sleep_time = atoi(argv[1]);
  sub_sleep_time = atoi(argv[2]);
  printf("メインスリープ時間=%dミリ秒\n",main_sleep_time);
  printf("サブスリープ時間=%dミリ秒\n",sub_sleep_time);
  ret = pthread_create(&tid,NULL,sub_thread,NULL);
  if (ret != 0){
    printf("pthread_create error:%d\n",ret);
    exit(1);
  }
  usleep(1000);  //1ミリ停止
  for (i = 0; i < 10; i++){
    ctr++;
    pthread_cond_signal(&cond_sub_th);
    sub_print("main","cond_signal完了",ctr);
    usleep(main_sleep_time*1000);
  }
  sleep(10);
  sub_print("main","スレッド停止",0);
  exit(0);
}
---------------------------------------------
第一引数にメインスレッドのスリープ時間
第二引数にサブスレッドのスリープ時間を指定します。
メインスレッド側で、スリープ時間を大きくとり、ゆっくりと
cond_signalを発行すると、空振りが起こりにくくなります。
逆にメインスレッド側で、スリープ時間を小さく取り、
cond_signalを速射すると、空振りが起こりやすくなります。
以下、実行結果。
メインスレッド:300ミリのスリープ
サブスレッド:100ミリのスリープの場合
cond_signal 300 100
メインスリープ時間=300ミリ秒
サブスリープ時間=100ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
sub:con_wait終了(2)
main:cond_signal完了(3)
sub:con_wait終了(3)
main:cond_signal完了(4)
sub:con_wait終了(4)
main:cond_signal完了(5)
sub:con_wait終了(5)
main:cond_signal完了(6)
sub:con_wait終了(6)
main:cond_signal完了(7)
sub:con_wait終了(7)
main:cond_signal完了(8)
sub:con_wait終了(8)
main:cond_signal完了(9)
sub:con_wait終了(9)
main:cond_signal完了(10)
sub:con_wait終了(10)
main:スレッド停止(0)

メインスレッド:100ミリのスリープ
サブスレッド:300ミリのスリープの場合
cond_signal 100 300
メインスリープ時間=100ミリ秒
サブスリープ時間=300ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
main:cond_signal完了(3)
main:cond_signal完了(4)
sub:con_wait終了(2)
main:cond_signal完了(5)
main:cond_signal完了(6)
main:cond_signal完了(7)
sub:con_wait終了(3)
main:cond_signal完了(8)
main:cond_signal完了(9)
main:cond_signal完了(10)
sub:con_wait終了(4)
main:スレッド停止(0)

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print =...続きを読む

Qアンダーバーが表示されない

アウトルックです(以下OL)
メールアドレスでアンダーバーを使用している友人がいます。
OLで連絡先に登録後宛先を見るとアンダーバーが表示されません。
宛先をコピー、他のソフトで貼り付け表示ではアンダーバーは表示されます。
表示されないだけでメール使用上は問題ありませんが。
なぜでしょうか?

Aベストアンサー

私が質問を誤解しているかもしれません。推定の範囲ですが、確認も含めて以下のようなことではないかと思うしだいです。

> OLで連絡先に登録後宛先を見るとアンダーバーが表示されません。

「登録後宛先を見る」というのは、Outlookの個人別「連絡先」にある「電子メール」に表示されているものを指しているのでしょうか。

もしそうなら、この表示は「全体に下線が施されている状態」ですから、ご質問の「アンダーバーが表示されません」は、妥当というのか、下線と重なっていて見えない状態なのではないかと思います。

念のため、個人別の連絡先ではなく、連絡先の一覧表示にして、「現在のビュー」を「連絡先カード(詳細)」に設定すると、名前の下に「電子メール」が表示されますが、このビューでは下線が設定されていませんから、アンダーバーが表示されて見えると思います。いかがでしょうか。的外れでしたら、スミマセン。

Q_CRT_SECURE_NO_DEPRECATE が効かない?

お世話になっております。
現在、Windows XP、VC++2005 にてプログラム中なのですが、
「strcpy()」についてです。

本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を
奨励されていますが、箇所が多いので取り合えずWarningだけでも
取りたいと思っています。

--
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
charszBuf[10];
strcpy( szBuf, "test" );

return 0;
}
--

というサンプルコードに対して

warning C4996: 'strcpy' が古い形式として宣言されました。
'strcpy' の宣言を確認してください。
'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

と出たので、ファイルの先頭に

#define_CRT_SECURE_NO_DEPRECATE

と加えたのですがWarningが取れません。
同様に

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

としても駄目でした。

他に何か必要なことはあるのでしょうか?
#pragmaは出来るだけ避けたいのですが。

以上、よろしくお願い致します。

お世話になっております。
現在、Windows XP、VC++2005 にてプログラム中なのですが、
「strcpy()」についてです。

本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を
奨励されていますが、箇所が多いので取り合えずWarningだけでも
取りたいと思っています。

--
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
charszBuf[10];
strcpy( szBuf, "test" );

return 0;
}
--

というサンプルコードに対して

warnin...続きを読む

Aベストアンサー

stdafx.hがあるならstdafx.hに
#define _CRT_SECURE_NO_DEPRECATE
を記述されたら良いと思います

Qアルファベットにアンダーバー

アルファベットの下にアンダーバーを付けて一文字とすることってできるのでしょうか?
インターネット契約している会社のメールサーバーに、○○.sf.○○
とあり、sfの下にアンダーバーがあるのですが、どうやってその文字を入力して良いのかわかりません。 アンダーバー無しで設定している現在、サーバーが見つからないというエラーが出てしまいます。

Aベストアンサー

英小文字の下にアンダーバーが表示されているってことですね?
ちょうどこのページの質問者とか回答者の名前の下にアンダーバーが見えるように

それでしたらソフト側でそのように表示させているだけですよ
入力する必要はありません、と言いますかできません。

QAES暗号にて、AES_set_encrypt_keyで設定されるAES_KEYについて

VC++2008にてopensslを用いて、AES暗号/復号の機能を作成しています。

AES_set_encrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_ENCRYPT)にて暗号、
AES_set_decrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_DECRYPT)にて復号するコーディングをしました。

(http://d.hatena.ne.jp/hnko/20090302/1235977892のenc_aes128_cbc_test()を参考にしましたので、
一連の流れは、こことほぼ同じです)

デバッグしてみると、一見、暗復号が問題なく出来ていたので、
AES_set_encrypt_key関数の第一引数のkey配列の値と、
ivec配列の値を変えて、デバッグしてみたところ、
key配列を変更すると、暗号化後の文字列も変更されますが、
ivec配列を変更しても、暗号後の文字列に変化が有りませんでした。

調べてみたところ、AES_set_encrypt_keyにて返される
AES_KEYのroundsの値が常に同じであることが原因と思われますが、
roundsの値が常に一定だと、暗号解読が比較的容易に
出来てしまうと思うのですが、上記で挙げたサイトでの
コーディングの他に、何か別にコーディングを足さなければならないのでしょうか?

よろしくお願いします。

VC++2008にてopensslを用いて、AES暗号/復号の機能を作成しています。

AES_set_encrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_ENCRYPT)にて暗号、
AES_set_decrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_DECRYPT)にて復号するコーディングをしました。

(http://d.hatena.ne.jp/hnko/20090302/1235977892のenc_aes128_cbc_test()を参考にしましたので、
一連の流れは、こことほぼ同じです)

デバッグしてみると、一見、暗復号が問題なく出来ていたので、
AES_set_encrypt_key関数の第一引...続きを読む

Aベストアンサー

>ivec配列を変更しても、暗号後の文字列に変化が有りませんでした。
初期ベクタを変えれば必ず暗号文が変化する筈。
変わらないとしたら、初期ベクタを変えているつもりで変わってないだけ。

因みに、初期ベクタは、1ブロック暗号化するたびに内容が更新されていくので、使い方を間違えないように。

>roundsの値が常に一定だと、暗号解読が比較的容易に
暗号鍵を変えればAES_KEYの内容も変化する筈。
変わらないとしたら、暗号鍵を変えているつもりで変わってないだけ。


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

人気Q&Aランキング

おすすめ情報