📘 C++ Style Guide¶
🏷️ Naming Conventions¶
╔════════════════════════════════════════════════════════════╗ ║ Element │ Convention │ Example ║ ╠════════════════╪═══════════════╪══════════════════════════╣ ║ Classes │ PascalCase │ AudioProcessor ║ ║ Functions │ camelCase │ processBuffer() ║ ║ Variables │ snake_case │ sample_rate ║ ║ Constants │ UPPER_CASE │ MAX_BUFFER_SIZE ║ ║ Members │ snake_case_ │ buffer_size_ ║ ║ Namespaces │ lowercase │ audiolab::dsp ║ ╚════════════════════════════════════════════════════════════╝
📁 File Organization¶
// AudioProcessor.hpp
#pragma once // Preferred over header guards
// System includes
#include <vector>
#include <memory>
// Third-party includes
#include <juce/juce.h>
// Project includes
#include "DSP/Filter.hpp"
namespace audiolab {
class AudioProcessor {
public:
// Public interface first
private:
// Implementation details last
};
} // namespace audiolab
💬 Comment Style¶
/// Brief description of function.
///
/// Detailed description if needed.
/// Can span multiple lines.
///
/// @param buffer Input audio buffer
/// @param size Size of buffer in samples
/// @return Processing result
ProcessResult processAudio(float* buffer, size_t size);
🔧 Error Handling¶
// ✅ GOOD: Exceptions for exceptional errors
if (!file.open()) {
throw std::runtime_error("Failed to open file");
}
// ✅ GOOD: Return codes for expected errors
Result tryProcess(Buffer& buffer) {
if (buffer.empty()) return Result::EmptyBuffer;
// ...
}
// ❌ BAD: Exceptions in real-time code
void audioCallback(float* buffer, size_t size) {
throw std::exception(); // NEVER!
}