Reading about x86 calling conventions…
Tag Archives: c++
POSIX Signals in C: List of Signals
See POSIX Signals in C for a list of signals…
Pretty printing C# files with extension cs-script in ViewVC
The pretty printing for my *.cs-script files (which are C# files) in ViewVC was really ugly and wrong. I needed to configure the MIME type for *.cs-script files. I edited the mimetypes.conf file and added:
text/x-csharp cs-script
C Pointers Fundamentals Explained with Examples
Read C Pointers Fundamentals Explained with Examples today to brush up on my rusty C skills.
MD5 in C++
MD5 in C++ is everywhere if you search for it (except for in the standard library or in boost, which isn’t what I would have expected), but I only needed one implementation and I found this one: RSA Data Security, Inc. MD5 Message-Digest Algorithm.
Detecting if code is compiling under Visual Studio
I wanted to figure out how to tell if my code was compiling in Visual Studio or somewhere else (GCC probably), and I found that you can use #ifdef _MSC_VER.
Operator overloading in C++
I did my first operator overloading in C++ today. My code ended up being quite different to the example code that I found, but I think I’m happy with it:
class FileData {
public:
FileData( const string& path );
static bool LessThan( const FileData& a, const FileData& b );
bool operator< ( const FileData& );
unsigned long size() const { return m_size; }
private:
unsigned long m_size;
char m_md5[ 16 ];
};
static bool operator< ( const FileData& a, const FileData& b ) {
return FileData::LessThan( a, b );
}
bool FileData::operator< ( const FileData& b ) {
return FileData::LessThan( *this, b );
}
bool FileData::LessThan ( const FileData& a, const FileData& b ) {
unsigned long a_size = a.size();
unsigned long b_size = b.size();
if ( a_size == b_size ) {
return memcmp( a.m_md5, b.m_md5, 16 ) < 0;
}
return a_size < b_size;
}
I'm not sure when it becomes either useful or necessary to define the operator both as a static and as a member function. I did both because I wasn't sure what was required.
Differences between C++ pointers and C++ references
I was curious about the difference between C++ pointers and C++ references, so I searched and found this which says that basically:
- It’s not necessary to initialise pointers at declaration time, but it is necessary to initialise references at declaration time.
- You can create an array of pointers, but you can’t create an array of references.
- You can assign null to pointers, but you can’t assign null to references.
Reading binary files in C++
I learned how to read binary files in C++ today. My function (which creates an MD5 hash of a file) ended up looking a little different to the example that I learned from:
const int BUFFER_SIZE = 1024;
int length;
char buffer[ BUFFER_SIZE ];
MD5_CTX ctx;
MD5Init( &ctx );
ifstream is( path.c_str(), ios::binary );
while ( is.good() ) {
is.read( (char *)buffer, BUFFER_SIZE );
streamsize count = is.gcount();
MD5Update( &ctx, (unsigned char *)buffer, count );
}
if ( is.eof() ) {
// it's ok, we're at the end of the file
}
else if ( is.bad() ) {
// bad bit is set
cout << "Bad bit is set while reading '" << path << "'." << endl;
cout << strerror( errno ) << endl;
exit ( 1 );
}
else if ( is.fail() ) {
cout << "Fail bit is set while reading '" << path << "'." << endl;
cout << strerror( errno ) << endl;
exit( 1 );
}
is.close();
Fatal error LNK1120: unresolved externals, caused by C functions in C++
I was receiving link error LNK1120 in Visual Studio after adding some C code to my C++ project, and the problem was, as I discovered here (and found more info on here), that I hadn’t declared my C code as “extern C”.
So basically I added #ifdef __cplusplus macros to check if it was C or C++ code and if C++ then outputting “extern C {” with a suitable “}” at the end of the file.