好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

同じファイルに C++ と Ruby のソースを両方書いてみる

g++ -o main.exe main.cpp

ruby main.cpp

の両方を通るようにしてみたかったんです。何に使うのかとか考えたら負けだと思う。何の役にも立たず害にしかならないと思うんだけど、消すのも忍びなかったのでメモ。

g++ でも ruby でも実行(コンパイル)できるようにする

#if 0

print "hellow, world.\n"

=begin
#endif

#include <stdio.h>

int main(int argc, char** args)
{
  printf("hello, world.\n");
  return 0;
}

#if 0
=end
#endif

C の #if と Ruby のコメント(#, =begin 〜 =end)を組み合わせただけ。

=end は行頭じゃないといかんので、相当変な書き方をしない限りは、どっちかのコンパイルでこけたりしない。

// 相当変な書き方
void hoge {
  int end = 10;
  int temp
=end
;
}

定数の共通化

#if 0

# Ruby 用ダミー関数
def const_char_p(*args); end
def s32(*args); end

=begin
#endif

// C用 定義マクロ
#define const_char_p const char*
#define s32 int

#if 0
=end

# C++/Ruby 共通定義
#endif

const_char_p HELLO = "hello, world.\n";
s32 num = 100;

#if 0
# Ruby 実行部分
if __FILE__ == $0
  print HELLO
  puts num
end

=begin
#endif

// C++ 実行部分
#include <iostream>

int main(int argc, char** args)
{
  std::cout << HELLO;
  std::cout << num << std::endl;
  return 0;
}

#if 0
=end
#endif

何に使うのかとかは考えたら負けですよ?(しつこい)

enum で定数定義

#if 0

# Ruby 用小細工
def enum(&block)
  block.call
end

def ENUM_DEF(*args); end

=begin
#endif

// C++ 用小細工
#define ENUM_DEF(args) args,

#if 0
=end

# C++/Ruby 共通定義
#endif

enum {
  ENUM_DEF(FLAG_A = 0x1)
  ENUM_DEF(FLAG_B = 0x2)
  ENUM_DEF(FLAG_C = 0x4)
};

#if 0
# Ruby 実行部分
if __FILE__ == $0
  puts FLAG_C
end

=begin
#endif

// C++ 実行部分
#include <iostream>

int main(int argc, char** args)
{
  std::cout << FLAG_C << std::endl;
  return 0;
}

#if 0
=end
#endif

いろいろ酷いな。何に使うのかとか考えt(ry

enum {
  A,
  B,
};

に、対応する術は思いつかなかった。

終わり

何に使うのかとk(ry