std::getline

std::getline時會等待斷行符,但需要注意的是
在使用pipe redirect時,會有flush的問題

  boost::process::ipstream child_stdout;
  boost::process::opstream child_stdin;    
  boost::process::child child_process;
  child_process = boost::process::child(exe_path,
      boost::process::std_out > child_stdout,
      boost::process::std_err > child_stdout,
      boost::process::std_in < child_stdin); 
   //...
   child_stdin << "QUIT" << std::endl; //OK
   child_stdin << "QUIT\n"; //NOT OK
   child_stdin << "QUIT\n" << std::flush; //OK

std::endl本身隱含了flush,因此送出斷行符較佳的方式還是使用std::endl

Posted in Tips | Leave a comment

comment tips

多行註解時 有時候只是暫時不需要

/*
  int x;
  // blah blah
*/

要取消掉,最簡單的方式是直接加上//

///*
  int x;
  // blah blah
//*/

這樣可以方便以後加回來,因為如果是直接刪掉/*, */ 加回來時常常會忘記要在哪裡開始結束
當然 #if 0, #if 1這樣也是一種常見的方式

或是 if(0) {}

Posted in Tips | Leave a comment

genisoimage


genisoimage -joliet-long -J -r -allow-lowercase -allow-multidot -o 檔案名.iso 目錄名稱

-J 為必須, 指定input charset 為unicode, 不然default是iso8859-1, 會導致output的名稱被取代成underscore

Posted in System Administration | Leave a comment

header only files tips

當開發header only library時,有時候會需要static or global物件,但因為C++ ODR的原因,
當物件被重複定義時在link階段會報錯。

例如

//X.h
class X
{
public:
  static int m; //這只是declaration
};

//main.cpp
#include "X.h"
int main()
{
  X a;
  a.m = 0;
  return 0;
}


/tmp/ccaFpbvF.o: In function `main':
t.cc:(.text+0x6): undefined reference to `X::m'
collect2: error: ld returned 1 exit status

因為沒有定義

所以需要加上out of class definition, int X::m; (static int default to 0)
但是理論上這是需要library開發者處理的, 使用者只需要include file

但不應該寫在.h檔 因為有可能會出現在多個translation unit內 這樣會違反ODR – one definition rule

最簡單的方式是提供一個cpp 把所有需要定義的變數寫在裡面。
請使用者在編譯時加進去

然而如果是template,這樣子做就行不通了,因為有可能會有使用者自定義的型別,這在一開始是無法知道的。

事實上,碰到static or global需要定義的變數時,可以用
singleton的方式來處理,利用把定義藏在function內,而function本身又是可以被inline來達成

//test.h
template 
class X
{
  X()
  {
    x = T();
  }
public:
  inline static X& get();
  T x;
};

template
inline X& X::get()
{
  static X m;
  return m;
}

//test.cc
#include "test.h"
#include 

int main ()
{
  typedef X XInt;
  XInt& x = XInt::get();
  std::cout << x.x << std::endl;
  return 0;
}

參考: http://en.cppreference.com/w/cpp/language/definition

Posted in C++ Language | Leave a comment

MSVC debug build

在VC++的設定:
C/C++若有定義_DEBUG 則需注意link應該link MTd or MDd
因為有些function 如_free_dbg是在定義_DEBUG時會被編譯(參考<crtdbg.h>)
此時如果link到release版的MT or MD,則會出現unresolved link

另外,這個錯誤訊息也是因為_DEBUG混用造成的

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in ...

在<yvals.h≶(一些c++ std header會間接引用)

#ifdef _DEBUG
  #define _HAS_ITERATOR_DEBUGGING 1
#else
  #define _HAS_ITERATOR_DEBUGGING 0
#endif

#if _HAS_ITERATOR_DEBUGGING
  #define _ITERATOR_DEBUG_LEVEL 2
#elif _SECURE_SCL
  #define _ITERATOR_DEBUG_LEVEL 1
#else
  #define _ITERATOR_DEBUG_LEVEL 0
#endif

#ifdef __cplusplus
  //這邊檢查LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in ...
  #ifndef _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
    #pragma detect_mismatch("_ITERATOR_DEBUG_LEVEL", _STRINGIZE(_ITERATOR_DEBUG_LEVEL))
  #endif /* _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH */
  //這邊檢查runtime lib:LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug'
  #ifndef _ALLOW_RUNTIME_LIBRARY_MISMATCH
  //....
#endif /* __cplusplus */  

因此在整合各個不同的(static)library時,最簡單的方式是確保所有的編譯runtime選項是一致,對於c interface dll則不用特別關注編譯選項的問題,只要確保allocate resource和release resource和release都是在dll內部處理(例如不應該將dll內部malloc的resource 在dll外部free)

Posted in Tips | Leave a comment

show gcc predefined macro


gcc -dM -E - < /dev/null

這邊僅列出有__STDC的作為範例

#define __STDC_HOSTED__ 1
#define __STDC_UTF_16__ 1
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201505L
#define __STDC_NO_THREADS__ 1
#define _STDC_PREDEF_H 1
#define __STDC_IEC_559_COMPLEX__ 1
#define __STDC_VERSION__ 201112L
#define __GNUC_STDC_INLINE__ 1
#define __STDC_UTF_32__ 1
#define __STDC__ 1
....

g++ notes: use an empty test.cpp

g++ -std=c++11 -pedantic -dM -E test.cpp

or use "-x c++" option to force c++ compiler (https://stackoverflow.com/questions/2224334/gcc-dump-preprocessor-defines)

Posted in C Language | Leave a comment

C99 _Bool

C99定義了關鍵字 _Bool, 又另外新增了stdbool.h

#define bool _Bool
#define true 1
#define false 0
為什麼用_Bool這樣看起來有點奇怪的命名而不直接定義bool?
最主要的原因是因為在c89 bool並非保留字,
因此在擴展規範時只能從reserved identifier下手了
在c89的規範 7.1.3第一項提到
All identifiers that begin with an underscore and either an uppercase letter or
another underscore are always reserved for any use.

Posted in C Language | Leave a comment

gcc flags about c standard

以gcc 5.1.0為例
https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Standards.html
The default, if no C language dialect options are given, is -std=gnu11.

如果要採用c89(or c90)
可使用下面的選項之一
-ansi
-std=c89
-std=c90
-std=iso9899:1990
這樣會關掉一些gnu extension
如果要對應C標準的要求
則再加上
-pedantic or -pedantic-errors

-std=c89 -pedantic

Posted in C Language | Leave a comment

mount tips

show export list

showmount -e #local
showmount -e 192.168.1.10 #remote


mount -t nfs 192.168.1.10:/XXXX /YYYY
nfsstat -m #查看nfs mount相關信息


mount -t cifs -o admin,passwd //192.168.1.10/base /mnt
mount -t cifs -o username=admin //192.168.1.10/base /mnt


VBoxManage storageattach #VBOXNAME --storagectl "SATA" --port 0 --device 0 --type hdd --medium iscsi --server #IP --target #IQN --tport 3260

ramdisk

mount none -t tmpfs -o size=500M ramdisk/

Posted in System Administration | Leave a comment

ssh亂碼

ssh進Mac時發生亂碼,可先檢查locale 是否設定成正確 (打locale即可)
一般是utf8,因為linux ssh client預設會forward locale env variable
可參考 /etc/ssh/ssh_config

SendEnv LANG LC_*

LANG=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_CTYPE=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_ALL=”en_US.UTF-8″

如果不是utf8則可以
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

也可設定在~/.bashrc

Posted in System Administration | Leave a comment