snippetcppMinor
Boost CRC example program file
Viewed 0 times
filecrcexampleprogramboost
Problem
I'm currently looking at this Boost::CRC example code which I have also inserted below.
I always try to look for suggestions for improving my own coding style when I encounter well-written and well-formatted code.
This code definitely looks like good code, but two things puzzle me about this:
-
is it good practice to copy
-
is it actually acceptable to just omit the parenthesis around a function body if the body is a
```
// Boost CRC example program file ------------------------------------------//
// Copyright 2003 Daryle Walker. Use, modification, and distribution are
// subject to the Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or a copy at .)
// See for the library's home page.
// Revision History
// 17 Jun 2003 Initial version (Daryle Walker)
#include // for boost::crc_32_type
#include // for EXIT_SUCCESS, EXIT_FAILURE
#include // for std::exception
#include // for std::ifstream
#include // for std::ios_base, etc.
#include // for std::cerr, std::cout
#include // for std::endl
// Redefine this to change to processing buffer size
#ifndef PRIVATE_BUFFER_SIZE
#define PRIVATE_BUFFER_SIZE 1024
#endif
// Global objects
std::streamsize const buffer_size = PRIVATE_BUFFER_SIZE;
// Main program
int
main
(
int argc,
char const * argv[]
)
try
{
boost::crc_32_type result;
for ( int i = 1 ; i < argc ; ++i )
{
std::ifstream ifs( argv[i], std::ios_base::binary );
if ( ifs )
{
do
{
char buffer[ buffer_size ];
ifs.read( buffer, buffer_size );
result.process_bytes( buffer, ifs.gcount() );
} while ( ifs );
}
else
{
std::cerr << "Failed to open file '" << argv[i] << "'."
<< std::endl;
I always try to look for suggestions for improving my own coding style when I encounter well-written and well-formatted code.
This code definitely looks like good code, but two things puzzle me about this:
-
is it good practice to copy
#defined constants to local const variables before using them? Why would this be a good idea?-
is it actually acceptable to just omit the parenthesis around a function body if the body is a
try-catch-block?```
// Boost CRC example program file ------------------------------------------//
// Copyright 2003 Daryle Walker. Use, modification, and distribution are
// subject to the Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or a copy at .)
// See for the library's home page.
// Revision History
// 17 Jun 2003 Initial version (Daryle Walker)
#include // for boost::crc_32_type
#include // for EXIT_SUCCESS, EXIT_FAILURE
#include // for std::exception
#include // for std::ifstream
#include // for std::ios_base, etc.
#include // for std::cerr, std::cout
#include // for std::endl
// Redefine this to change to processing buffer size
#ifndef PRIVATE_BUFFER_SIZE
#define PRIVATE_BUFFER_SIZE 1024
#endif
// Global objects
std::streamsize const buffer_size = PRIVATE_BUFFER_SIZE;
// Main program
int
main
(
int argc,
char const * argv[]
)
try
{
boost::crc_32_type result;
for ( int i = 1 ; i < argc ; ++i )
{
std::ifstream ifs( argv[i], std::ios_base::binary );
if ( ifs )
{
do
{
char buffer[ buffer_size ];
ifs.read( buffer, buffer_size );
result.process_bytes( buffer, ifs.gcount() );
} while ( ifs );
}
else
{
std::cerr << "Failed to open file '" << argv[i] << "'."
<< std::endl;
Solution
With the manifest constant being assigned to a const variable, you now have two ways of referring to the same value. In principle, this is superfluous, and should therefore be avoided. In practice, with manifest constants always being globally visible in C++, this is a rather moot point, but it can still be used for making a decision in lack of any other point. So, if there are any other considerations not immediately evident in the code, such as the need to be able to redefine the manifest constant AND at the same time the need to have the constant strongly typed, then by all means, it should be kept, and preferably documented.
The try statement used as a function body looks mighty weird, which means that the average C++ programmer looking at it will go "WTF?". At the same time it does not accomplish any mighty feat that will make one add "--oh, I see why it is done that way, cool!". It is okay for a coding technique to have a certain WTF factor to it, as long as it accomplishes something neat, the neatness of which is proportional to its WTFness, so as to justify it. All that the try-statement-used-as-a-function-body accomplishes is to spare us from having to type an additional --but expected-- pair of curly brackets. Therefore, it should definitely be avoided.
The try statement used as a function body looks mighty weird, which means that the average C++ programmer looking at it will go "WTF?". At the same time it does not accomplish any mighty feat that will make one add "--oh, I see why it is done that way, cool!". It is okay for a coding technique to have a certain WTF factor to it, as long as it accomplishes something neat, the neatness of which is proportional to its WTFness, so as to justify it. All that the try-statement-used-as-a-function-body accomplishes is to spare us from having to type an additional --but expected-- pair of curly brackets. Therefore, it should definitely be avoided.
Context
StackExchange Code Review Q#6295, answer score: 6
Revisions (0)
No revisions yet.